From 9c1678bebbf9eea75bcb3eef27ab62b5586ebe07 Mon Sep 17 00:00:00 2001 From: usantos Date: Tue, 18 Aug 2026 22:29:53 -0300 Subject: [PATCH 01/21] Adicionado o mapa Treta no Vietnan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: Codex (GPT-5) Commit-grande: mapa completo com preview, auditorias e documentação gerada Signed-off-by: usantos --- AGENTS.md | 8 +- README.md | 19 +- STATUS.md | 6 +- docs/docs/arquitetura.md | 4 +- docs/docs/colaborar.md | 5 +- docs/docs/comecando.md | 17 +- docs/docs/quality-gates.md | 2 +- docs/docs/stack.md | 2 +- .../current/arquitetura.md | 4 +- .../current/colaborar.md | 5 +- .../current/comecando.md | 17 +- .../current/quality-gates.md | 2 +- .../current/stack.md | 2 +- package.json | 6 +- public/img/map-previews/treta_vietnan.jpg | Bin 0 -> 31255 bytes public/js/main.js | 2 + public/js/map_treta_vietnan.js | 547 +++++++ public/js/maps.js | 2 + src/data/jogo.ts | 8 + src/pages/maps.astro | 8 + tools/eval/ARCH.md | 2 +- tools/eval/g2ui-map-previews.mjs | 13 +- tools/eval/map_check.json | 577 ++++++- tools/eval/pickup_check.json | 1352 ++++++++++++++++- tools/eval/telas-menu7.mjs | 4 +- tools/eval/vietnam-check.mjs | 175 +++ 26 files changed, 2736 insertions(+), 53 deletions(-) create mode 100644 public/img/map-previews/treta_vietnan.jpg create mode 100644 public/js/map_treta_vietnan.js create mode 100644 tools/eval/vietnam-check.mjs diff --git a/AGENTS.md b/AGENTS.md index 012e48224..ddb17cabb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,9 +41,9 @@ algo está errado e o quality gate está verde, o defeito é do quality gate. | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 39 arquivos `.js`, 29.655 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 40 arquivos `.js`, 30.206 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 19 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 177 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 178 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. @@ -149,10 +149,10 @@ Um assunto, um arquivo. Se você precisa da informação, é daqui que você sai ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:vietnam ``` -`package.json` tem **104 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. +`package.json` tem **105 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/README.md b/README.md index e33450615..5c59adfe9 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 29.655 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 30.206 linhas em 40 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.560** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.512 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.514 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 7 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 8 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 178 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.136` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` @@ -290,7 +290,7 @@ projeto. | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 7 — 2 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 8 — 3 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -324,8 +324,9 @@ Os mapas registrados, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 10 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 8a20af50e..6bae69b18 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.136` -- **Conteúdo jogável:** 5 facções, 44 personagens, 7 mapas e 26 armas com GLB -- **Código do jogo:** 29.655 linhas em 39 módulos JavaScript -- **Automação:** 104 comandos npm, 177 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 8 mapas e 26 armas com GLB +- **Código do jogo:** 30.206 linhas em 40 módulos JavaScript +- **Automação:** 105 comandos npm, 178 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/arquitetura.md b/docs/docs/arquitetura.md index a668531cb..5d6e24f8b 100644 --- a/docs/docs/arquitetura.md +++ b/docs/docs/arquitetura.md @@ -63,14 +63,14 @@ Tamanho dos arquivos que o `gen-arch.mjs` indexa — bloco gerado, regenerado po | Arquivo | Linhas | |---|---:| | `public/js/game.js` | 6.560 | -| `public/js/main.js` | 2.512 | +| `public/js/main.js` | 2.514 | | `public/js/characters.js` | 1.068 | | `public/js/glbchars.js` | 837 | | `public/js/vmattach.js` | 628 | | `public/js/weapons.js` | 344 | | `public/js/springs.js` | 260 | -Total de `public/js/`: **29.655 linhas em 39 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`). +Total de `public/js/`: **30.206 linhas em 40 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`). > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: ``git ls-files public/js/*.js | xargs wc -l`` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 7049c17c3..8c168a24f 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**9 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Emerson Garrido`, `rubenmarcus`, `Ruben`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `matheusgb`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**10 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Emerson Garrido`, `rubenmarcus`, `Ruben`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `matheusgb`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -255,8 +255,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 10 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 32aa3c06d..6ffec043f 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 29.655 linhas em 39 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 30.206 linhas em 40 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.560** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.512 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.514 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 7 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 8 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 178 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.136` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 7 — 2 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 8 — 3 abrem em rodadas, **5 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -228,8 +228,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `quebrada` | Quebrada (Rua do Baile) | **captura** | `map_quebrada.js` | 1.599 | | `posto_treta` | Posto da Treta | **captura** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 255 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**7 mapas registrados** — 2 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 9 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**8 mapas registrados** — 3 abrem em rodadas e 5 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 10 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` @@ -271,10 +272,10 @@ E os dois quality gates, com a lista exata do que cada um roda — direto do `pa ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:vietnam ``` -`package.json` tem **104 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. +`package.json` tem **105 scripts**. Vários trazem uma chave `//nome` logo acima com o motivo de existirem — é onde mora o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index a42f73078..49feb9b2d 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.271 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **177 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. +- O arnês inteiro são **178 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/docs/stack.md b/docs/docs/stack.md index 53a09025f..5f0a243c6 100644 --- a/docs/docs/stack.md +++ b/docs/docs/stack.md @@ -17,7 +17,7 @@ a partir do `package.json`, do `docs/package.json` e do próprio Three.js vendor | Camada | Ferramenta | Versão | |---|---|---| | Motor 3D (WebGL) | **Three.js**, vendorizado | `r160` | -| Jogo | ES modules vanilla, **zero build** | 39 arquivos | +| Jogo | ES modules vanilla, **zero build** | 40 arquivos | | Site | **Astro** com SSR | `^7.1.1` | | Hospedagem | adapter **Vercel** | `^11.0.3` | | Banco | **Postgres gerenciado** (RLS; schema privado, fora do repo) | `^2.110.7` | diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md index 73686d976..2e47e3b00 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/arquitetura.md @@ -70,14 +70,14 @@ Size of the files `gen-arch.mjs` indexes — a generated block, regenerated by | File | Lines | |---|---:| | `public/js/game.js` | 6,560 | -| `public/js/main.js` | 2,512 | +| `public/js/main.js` | 2,514 | | `public/js/characters.js` | 1,068 | | `public/js/glbchars.js` | 837 | | `public/js/vmattach.js` | 628 | | `public/js/weapons.js` | 344 | | `public/js/springs.js` | 260 | -Total in `public/js/`: **29,655 lines in 39 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`. +Total in `public/js/`: **30,206 lines in 40 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`. > Block generated by `node tools/gen-docs.mjs`. Source: ``wc -l public/js/*.js`` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index 276b542e5..dccba729d 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**9 human author identities** sign commits in this branch: `ruben-cytonic`, `Emerson Garrido`, `rubenmarcus`, `Ruben`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `matheusgb`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**10 human author identities** sign commits in this branch: `ruben-cytonic`, `Emerson Garrido`, `rubenmarcus`, `Ruben`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `matheusgb`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -258,8 +258,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,599 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **capture** | `map_atacadao.js` | 255 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**7 registered maps** - 2 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**8 registered maps** - 3 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 10 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 662c1725f..57e68dae6 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 29,655 lines in 39 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 30,206 lines in 40 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6,560** lines | `wc -l public/js/game.js` | -| `main.js` | 2,512 lines | `wc -l public/js/main.js` | +| `main.js` | 2,514 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 7 | `MAPS` object in `maps.js` | +| Maps in the registry | 8 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 177 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 178 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.136` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 7 - 2 open in rounds, **5 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 8 - 3 open in rounds, **5 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -230,8 +230,9 @@ The maps registered today, and which mode each one opens in: | `quebrada` | Quebrada (Rua do Baile) | **capture** | `map_quebrada.js` | 1,599 | | `posto_treta` | Posto da Treta | **capture** | `map_posto.js` | 489 | | `atacadao_treta` | Atacadão da Treta | **capture** | `map_atacadao.js` | 255 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**7 registered maps** - 2 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 9 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**8 registered maps** - 3 open in rounds and 5 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 10 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` @@ -273,10 +274,10 @@ And the two gates, with the exact list of what each one runs — straight from ` ```bash npm run check # npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:vietnam ``` -`package.json` has **104 scripts**. Keys prefixed with `//` explain why the adjacent command exists. +`package.json` has **105 scripts**. Keys prefixed with `//` explain why the adjacent command exists. > Block generated by `node tools/gen-docs.mjs`. Source: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 1508d4732..e69a541fe 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,271 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **177 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. +- The harness contains **178 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md index dcff2d5fc..cbc32b79d 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/stack.md @@ -20,7 +20,7 @@ from `package.json`, `docs/package.json` and the vendored Three.js itself. | Layer | Tool | Version | |---|---|---| | 3D engine (WebGL) | **Three.js**, vendored | `r160` | -| Game | vanilla ES modules, **zero build** | 39 files | +| Game | vanilla ES modules, **zero build** | 40 files | | Site | **Astro** with SSR | `^7.1.1` | | Hosting | **Vercel** adapter | `^11.0.3` | | Database | **managed Postgres** (RLS; private schema) | `^2.110.7` | diff --git a/package.json b/package.json index a7cc5bbbc..a1c4d8e45 100644 --- a/package.json +++ b/package.json @@ -175,13 +175,15 @@ "//check:deploy": "O PORTÃO QUE RODA NO BUILD DA VERCEL, entre o assert:assets e o astro build. Existe porque a integração Git da Vercel publica em PARALELO com o CI: commit vermelho vai pro ar do mesmo jeito (aconteceu em 07/08, arch:check quebrado deployado). Aqui, vermelho = não publica. É subconjunto do check:fast de propósito — só o que foi PROVADO em clone descartável, sem navegador e sem rede. O eval:invariants ficou de FORA por medição: 376 s no clone limpo, e 6 min em todo deploy compram pouco (ele já roda no CI). Entram aqui só passos baratos e determinísticos: sintaxe, telemetria, identidade, poda do build, HUD do vmlab, default do vm-inspect, ARCH, docs geradas, manifesto de mídia e animação, texto público e aspecto dos cartazes.", "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters", "//check:fast": "O runner percorre TODOS os passos e só reprova no fim; nenhum vermelho pode esconder os portões seguintes. A ordem ainda é deliberada: docs:check vem antes de arch:check para diagnosticar documentação derivada primeiro, e eval:redesign roda antes dos checks de mídia/animação porque também verifica o contrato entre fonte e assets.", - "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock", + "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:vietnam", "//check": "eval:vm ANTES de eval:invariants: as invariantes de VM LEEM o vm_mint_audit.json que o eval:vm ESCREVE. Na ordem antiga o && cortava no primeiro vermelho e o JSON nunca era regenerado — o portão media o viewmodel de ontem e inventava vermelha (26/26 armas 'fora' que viraram 3/26 depois de regenerar). Ver KNOWN-BUGS.md BUG-02.", "check": "npm run syntax && npm run audio:check && npm run eval:medianet && npm run eval:ctfhud && npm run eval:vm && npm run eval:invariants && npm run eval:kick && npm run eval:bots", "//eval:tags": "Tag, main e versao contam a MESMA historia. Nasceu de defeito real: push nao atomico de dois refspecs deixou a v2.0.0-alpha.93 apontando pra commit que nunca chegou na main, e a sequencia pulou .92 -> .94. O versao-bumpada compara arquivo x arquivo e o eval:release valida gatilho; ninguem olhava o grafo do git. TM3 exige rede e gh: rode com --rede fora do portao rapido. Mutacoes: --mutante=tag-orfa|versao-atrasada|release-faltando|tag-fora-do-padrao", "eval:tags": "node tools/eval/tag-main-check.mjs", "//eval:simclock": "FPS baixo não pode desacelerar o relógio do jogo (issue #295). O clamp de 50 ms era TETO POR FRAME: abaixo de 20 FPS cada frame de 100 ms entregava 50 ms à simulação e a partida andava na metade do relógio de parede — relato de jogador em câmera lenta. O loop agora FATIA o frame em passos de ≤ 50 ms (mesma semântica por passo) com teto de 4 fatias (guard de espiral: máquina que não acompanha descarta o excesso) e só a última fatia renderiza. Estática estrutural (mesmo contrato do eval:medianet): SC1 fatio do delta real · SC2 teto com VALOR lido (nome existindo com 1e9 passava — furo do mutante) · SC3 clamp solto proibido. --mutante=clamp-frame|sem-teto.", - "eval:simclock": "node tools/eval/sim-clock-check.mjs" + "eval:simclock": "node tools/eval/sim-clock-check.mjs", + "//eval:vietnam": "Treta no Vietnã precisa ter duas rampas realmente caminháveis até guaritas elevadas, arsenal completo, navegação entre spawns e preview. A régua mede o builder real e a função de altura em 25 amostras por rampa. Mutantes: --mutante=sem-rampa|rampa-plana.", + "eval:vietnam": "node tools/eval/vietnam-check.mjs" }, "repository": { "type": "git", diff --git a/public/img/map-previews/treta_vietnan.jpg b/public/img/map-previews/treta_vietnan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..988d2fcbe4391ad09a76a4b3365d1a24edbad4cf GIT binary patch literal 31255 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 z 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 0; + return () => { + n = (n * 1664525 + 1013904223) >>> 0; + return n / 4294967296; + }; +} + +function makeLeafTextures() { + const canvas = document.createElement('canvas'); + canvas.width = canvas.height = 256; + const ctx = canvas.getContext('2d'); + const rnd = seededNoise(1973); + ctx.fillStyle = '#849772'; + ctx.fillRect(0, 0, 256, 256); + ctx.beginPath(); + ctx.moveTo(128, 15); + ctx.bezierCurveTo(202, 48, 221, 151, 128, 241); + ctx.bezierCurveTo(35, 151, 54, 48, 128, 15); + ctx.closePath(); + ctx.save(); + ctx.clip(); + const gradient = ctx.createLinearGradient(42, 20, 210, 235); + gradient.addColorStop(0, '#d5e2bd'); + gradient.addColorStop(0.48, '#9eb57d'); + gradient.addColorStop(1, '#6f8956'); + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 256, 256); + for (let i = 0; i < 180; i++) { + const shade = 95 + Math.floor(rnd() * 90); + ctx.fillStyle = `rgba(${shade},${shade + 12},${shade - 8},${0.05 + rnd() * 0.13})`; + ctx.beginPath(); + ctx.ellipse(rnd() * 256, rnd() * 256, 2 + rnd() * 9, 1 + rnd() * 5, rnd() * Math.PI, 0, Math.PI * 2); + ctx.fill(); + } + ctx.restore(); + for (let i = 0; i < 58; i++) { + const x = rnd() * 256, y = rnd() * 256, angle = rnd() * Math.PI; + ctx.save(); + ctx.translate(x, y); ctx.rotate(angle); + ctx.fillStyle = `rgba(${82 + rnd() * 55},${105 + rnd() * 65},${66 + rnd() * 42},${0.12 + rnd() * 0.2})`; + ctx.beginPath(); ctx.ellipse(0, 0, 3 + rnd() * 8, 1.2 + rnd() * 3.5, 0, 0, Math.PI * 2); ctx.fill(); + ctx.strokeStyle = 'rgba(45,63,35,.32)'; ctx.lineWidth = 0.8; + ctx.beginPath(); ctx.moveTo(-5, 0); ctx.lineTo(5, 0); ctx.stroke(); + ctx.restore(); + } + ctx.strokeStyle = 'rgba(46,66,32,.75)'; + ctx.lineWidth = 5; + ctx.beginPath(); ctx.moveTo(128, 232); ctx.quadraticCurveTo(122, 124, 128, 23); ctx.stroke(); + ctx.lineWidth = 2; + for (let y = 48; y <= 205; y += 23) { + const reach = 39 + (1 - Math.abs(y - 128) / 128) * 31; + ctx.beginPath(); ctx.moveTo(126, y + 8); ctx.quadraticCurveTo(91, y - 4, 128 - reach, y - 16); ctx.stroke(); + ctx.beginPath(); ctx.moveTo(128, y + 8); ctx.quadraticCurveTo(165, y - 5, 128 + reach, y - 17); ctx.stroke(); + } + ctx.strokeStyle = 'rgba(222,232,197,.42)'; + ctx.lineWidth = 2; + ctx.stroke(); + + const color = new THREE.CanvasTexture(canvas); + color.colorSpace = THREE.SRGBColorSpace; + color.anisotropy = 4; + const bump = new THREE.CanvasTexture(canvas); + bump.colorSpace = THREE.NoColorSpace; + bump.anisotropy = 4; + return { color, bump }; +} + +function makeWarSkyTexture() { + const canvas = document.createElement('canvas'); + canvas.width = 1024; canvas.height = 512; + const ctx = canvas.getContext('2d'); + const rnd = seededNoise(1968); + const dusk = ctx.createLinearGradient(0, 0, 0, 512); + dusk.addColorStop(0, '#111820'); + dusk.addColorStop(0.48, '#273039'); + dusk.addColorStop(0.78, '#4b4c47'); + dusk.addColorStop(1, '#75634c'); + ctx.fillStyle = dusk; ctx.fillRect(0, 0, 1024, 512); + ctx.save(); + ctx.filter = 'blur(24px)'; + for (let layer = 0; layer < 4; layer++) { + const yBase = 78 + layer * 76; + for (let i = 0; i < 78; i++) { + const shade = 17 + layer * 9 + Math.floor(rnd() * 18); + ctx.fillStyle = `rgba(${shade},${shade + 6},${shade + 9},${0.10 + rnd() * 0.18})`; + ctx.beginPath(); + ctx.ellipse(rnd() * 1024, yBase + (rnd() - 0.5) * 110, + 28 + rnd() * 110, 12 + rnd() * 38, rnd() * 0.22, 0, Math.PI * 2); + ctx.fill(); + } + } + ctx.restore(); + for (let i = 0; i < 145; i++) { + const x = rnd() * 1024, y = 250 + rnd() * 230; + ctx.strokeStyle = `rgba(182,194,195,${0.025 + rnd() * 0.045})`; + ctx.lineWidth = 1; + ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x - 7, y + 19 + rnd() * 23); ctx.stroke(); + } + const texture = new THREE.CanvasTexture(canvas); + texture.colorSpace = THREE.SRGBColorSpace; + texture.wrapS = THREE.RepeatWrapping; + texture.anisotropy = 2; + return texture; +} + +function makeMaterials() { + const dirt = canvasTexture((ctx, w, h) => { + const rnd = seededNoise(1948); + ctx.fillStyle = '#625039'; ctx.fillRect(0, 0, w, h); + for (let i = 0; i < 1250; i++) { + const light = 45 + Math.floor(rnd() * 36); + ctx.fillStyle = `rgba(${light + 25},${light + 17},${light},${0.08 + rnd() * 0.16})`; + const r = 1 + rnd() * 5; + ctx.fillRect(rnd() * w, rnd() * h, r * 2.4, r); + } + for (let i = 0; i < 58; i++) { + ctx.fillStyle = `rgba(${48 + rnd() * 20},${72 + rnd() * 24},${35 + rnd() * 14},${0.10 + rnd() * 0.16})`; + ctx.beginPath(); ctx.ellipse(rnd() * w, rnd() * h, 5 + rnd() * 20, 3 + rnd() * 12, rnd() * Math.PI, 0, Math.PI * 2); ctx.fill(); + } + }, 11, 11); + const wood = canvasTexture((ctx, w, h) => { + const rnd = seededNoise(1969); + ctx.fillStyle = '#6f4a28'; ctx.fillRect(0, 0, w, h); + for (let x = 0; x < w; x += 32) { + ctx.fillStyle = x % 64 ? '#76502d' : '#644222'; ctx.fillRect(x, 0, 29, h); + ctx.fillStyle = 'rgba(30,18,9,.42)'; ctx.fillRect(x + 28, 0, 4, h); + for (let i = 0; i < 10; i++) { + ctx.strokeStyle = `rgba(38,20,8,${0.12 + rnd() * 0.18})`; ctx.lineWidth = 1 + rnd() * 2; + ctx.beginPath(); ctx.moveTo(x + 3, rnd() * h); ctx.bezierCurveTo(x + 10, rnd() * h, x + 20, rnd() * h, x + 26, rnd() * h); ctx.stroke(); + } + } + }, 3, 2); + const bamboo = canvasTexture((ctx, w, h) => { + ctx.fillStyle = '#a39256'; ctx.fillRect(0, 0, w, h); + for (let x = 0; x < w; x += 18) { + ctx.fillStyle = x % 36 ? '#b8a767' : '#958348'; ctx.fillRect(x, 0, 14, h); + ctx.fillStyle = 'rgba(43,45,20,.45)'; ctx.fillRect(x + 14, 0, 4, h); + for (let y = 18; y < h; y += 50) { ctx.fillStyle = 'rgba(60,55,24,.55)'; ctx.fillRect(x, y, 15, 4); } + } + }, 4, 2); + const metal = canvasTexture((ctx, w, h) => { + const rnd = seededNoise(1975); + ctx.fillStyle = '#6f765f'; ctx.fillRect(0, 0, w, h); + for (let x = 0; x < w; x += 20) { + ctx.fillStyle = x % 40 ? '#7f856c' : '#626956'; ctx.fillRect(x, 0, 17, h); + ctx.fillStyle = 'rgba(25,29,24,.35)'; ctx.fillRect(x + 17, 0, 3, h); + } + for (let i = 0; i < 75; i++) { + ctx.fillStyle = `rgba(112,52,25,${0.16 + rnd() * 0.25})`; + ctx.beginPath(); ctx.arc(rnd() * w, rnd() * h, 2 + rnd() * 8, 0, Math.PI * 2); ctx.fill(); + } + }, 4, 2); + const stone = canvasTexture((ctx, w, h) => { + const rnd = seededNoise(1972); + ctx.fillStyle = '#777968'; ctx.fillRect(0, 0, w, h); + ctx.strokeStyle = 'rgba(37,40,31,.5)'; ctx.lineWidth = 5; + for (let y = 0; y <= h; y += 42) { + ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(w, y); ctx.stroke(); + const off = (Math.floor(y / 42) % 2) * 31; + for (let x = off; x < w; x += 64) { ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x, y + 42); ctx.stroke(); } + } + for (let i = 0; i < 150; i++) { ctx.fillStyle = `rgba(175,170,135,${rnd() * 0.12})`; ctx.fillRect(rnd() * w, rnd() * h, 4, 3); } + }, 3, 2); + + const foliage = makeLeafTextures(); + const woodBump = wood.clone(); woodBump.colorSpace = THREE.NoColorSpace; + const bambooBump = bamboo.clone(); bambooBump.colorSpace = THREE.NoColorSpace; + const leafMaterial = (color) => new THREE.MeshStandardMaterial({ + color, map: foliage.color, bumpMap: foliage.bump, bumpScale: 0.055, + roughness: 0.88, metalness: 0, side: THREE.DoubleSide, + }); + const lam = (map, color = 0xffffff) => new THREE.MeshLambertMaterial({ map, color }); + return { + dirt: lam(dirt, 0xa59b8c), wood: lam(wood, 0xb89570), bamboo: lam(bamboo), metal: lam(metal), stone: lam(stone), + towerWood: new THREE.MeshStandardMaterial({ map: wood, bumpMap: woodBump, bumpScale: 0.075, color: 0xa17a59, roughness: 0.92, metalness: 0 }), + towerBamboo: new THREE.MeshStandardMaterial({ map: bamboo, bumpMap: bambooBump, bumpScale: 0.055, color: 0xa29575, roughness: 0.9, metalness: 0 }), + mud: new THREE.MeshLambertMaterial({ color: 0x443a25 }), + darkWood: new THREE.MeshLambertMaterial({ color: 0x392719 }), + sandbag: new THREE.MeshLambertMaterial({ color: 0x8e8259 }), + leaf: leafMaterial(0x315b27), + leafLight: leafMaterial(0x4d7835), + trunk: new THREE.MeshLambertMaterial({ color: 0x49351f }), + water: new THREE.MeshLambertMaterial({ color: 0x536f50, transparent: true, opacity: 0.78 }), + black: new THREE.MeshLambertMaterial({ color: 0x20231f }), + steel: new THREE.MeshLambertMaterial({ color: 0x626963 }), + smoke: new THREE.MeshLambertMaterial({ color: 0x303638, transparent: true, opacity: 0.12, depthWrite: false }), + }; +} + +export function buildTretaVietnam(scene) { + const root = new THREE.Group(); + root.name = 'treta-no-vietnan'; + scene.add(root); + const colliders = [], occluders = [], pickups = []; + const M = makeMaterials(); + const sky = new THREE.Mesh(new THREE.SphereGeometry(145, 32, 16), new THREE.MeshBasicMaterial({ + map: makeWarSkyTexture(), side: THREE.BackSide, fog: false, depthWrite: false, + })); + sky.name = 'ceu-tempestade-vietnan'; sky.renderOrder = -1000; scene.add(sky); + const boxGeometries = new Map(); + + function addBox(w, h, d, mat, x, y, z, opts = {}) { + const geometryKey = `${w}:${h}:${d}`; + let geometry = boxGeometries.get(geometryKey); + if (!geometry) { geometry = new THREE.BoxGeometry(w, h, d); boxGeometries.set(geometryKey, geometry); } + const mesh = new THREE.Mesh(geometry, mat); + mesh.position.set(x, y + h / 2, z); + if (opts.rx) mesh.rotation.x = opts.rx; + if (opts.ry) mesh.rotation.y = opts.ry; + if (opts.rz) mesh.rotation.z = opts.rz; + mesh.castShadow = opts.cast !== false; mesh.receiveShadow = true; + mesh.name = opts.name || ''; + root.add(mesh); + if (opts.occlude !== false) occluders.push(mesh); + if (opts.collide !== false) { + const ex = opts.ex ?? (opts.ry ? Math.abs(Math.cos(opts.ry)) * w / 2 + Math.abs(Math.sin(opts.ry)) * d / 2 : w / 2); + const ez = opts.ez ?? (opts.ry ? Math.abs(Math.sin(opts.ry)) * w / 2 + Math.abs(Math.cos(opts.ry)) * d / 2 : d / 2); + colliders.push({ minX: x - ex, maxX: x + ex, minY: y, maxY: y + h, minZ: z - ez, maxZ: z + ez }); + } + return mesh; + } + + function addCylinder(rt, rb, h, seg, mat, x, y, z, collide = false) { + const mesh = new THREE.Mesh(new THREE.CylinderGeometry(rt, rb, h, seg), mat); + mesh.position.set(x, y + h / 2, z); mesh.castShadow = true; mesh.receiveShadow = true; root.add(mesh); + occluders.push(mesh); + if (collide) colliders.push({ minX: x - rb, maxX: x + rb, minY: y, maxY: y + h, minZ: z - rb, maxZ: z + rb }); + return mesh; + } + + const ground = new THREE.Mesh(new THREE.PlaneGeometry(HALF * 2, HALF * 2), M.dirt); + ground.rotation.x = -Math.PI / 2; ground.receiveShadow = true; ground.name = 'terra-selva'; root.add(ground); + const stream = new THREE.Mesh(new THREE.PlaneGeometry(7, 62), M.water); + stream.rotation.x = -Math.PI / 2; stream.position.set(0, 0.025, 0); root.add(stream); + for (const z of [-28, -9, 10, 29]) { + addBox(9, 0.22, 3.2, M.wood, 0, 0.02, z, { collide: false, name: 'ponte-madeira' }); + for (const x of [-3.8, 3.8]) addBox(0.18, 0.8, 3.2, M.darkWood, x, 0.2, z, { collide: false, occlude: false }); + } + + addBox(HALF * 2 + 2, 2.6, 1.1, M.stone, 0, 0, -HALF - 0.5); + addBox(HALF * 2 + 2, 2.6, 1.1, M.stone, 0, 0, HALF + 0.5); + addBox(1.1, 2.6, HALF * 2, M.stone, -HALF - 0.5, 0, 0); + addBox(1.1, 2.6, HALF * 2, M.stone, HALF + 0.5, 0, 0); + + function hut(x, z, ry = 0) { + const group = new THREE.Group(); group.position.set(x, 0, z); group.rotation.y = ry; root.add(group); + const part = (w, h, d, mat, px, py, pz) => { + const m = new THREE.Mesh(new THREE.BoxGeometry(w, h, d), mat); m.position.set(px, py + h / 2, pz); m.castShadow = true; m.receiveShadow = true; group.add(m); occluders.push(m); return m; + }; + part(7.2, 0.12, 5.2, M.wood, 0, 0.02, 0); + for (const px of [-3.1, 3.1]) for (const pz of [-2.1, 2.1]) part(0.35, 0.18, 0.35, M.darkWood, px, 0, pz); + part(0.35, 2.8, 5.2, M.bamboo, -3.45, 0.14, 0); + part(0.35, 2.8, 5.2, M.bamboo, 3.45, 0.14, 0); + part(4.8, 2.8, 0.35, M.bamboo, -1.2, 0.14, -2.45); + part(1.4, 2.8, 0.35, M.bamboo, 2.9, 0.14, -2.45); + part(7.5, 0.22, 3.2, M.metal, 0, 3.08, -1.55).rotation.x = -0.23; + part(7.5, 0.22, 3.2, M.metal, 0, 3.08, 1.55).rotation.x = 0.23; + const cs = Math.cos(ry), sn = Math.sin(ry); + const collider = (lx, lz, hx, hz, h = 3.8) => { + const wx = x + lx * cs + lz * sn, wz = z - lx * sn + lz * cs; + colliders.push({ minX: wx - hx, maxX: wx + hx, minY: 0, maxY: h, minZ: wz - hz, maxZ: wz + hz }); + }; + collider(-3.45, 0, 0.35, 2.6); collider(3.45, 0, 0.35, 2.6); + collider(-1.2, -2.45, 2.4, 0.35); collider(2.9, -2.45, 0.7, 0.35); + } + hut(-13, -16, 0.12); hut(14, 15, Math.PI + 0.12); hut(-14, 15, Math.PI - 0.08); hut(13, -16, -0.08); + + function spawnPalisade(z, direction) { + for (let i = 0; i < 4; i++) { + const x = -12 + i * 8; + const offsetZ = (i % 2 ? 0.55 : -0.55) * direction; + addBox(5.6, 2.35, 0.48, M.bamboo, x, 0, z + offsetZ, { name: 'barreira-spawn-bambu' }); + addBox(5.9, 0.16, 0.18, M.darkWood, x, 0.45, z + offsetZ - 0.27 * direction, + { collide: false, occlude: false, name: 'travessa-barreira-spawn' }); + addBox(5.9, 0.16, 0.18, M.darkWood, x, 1.65, z + offsetZ - 0.27 * direction, + { collide: false, occlude: false, name: 'travessa-barreira-spawn' }); + } + } + spawnPalisade(-32, 1); + spawnPalisade(32, -1); + + function sandbagWall(x, z, count, alongX, ry = 0) { + for (let i = 0; i < count; i++) { + const offset = (i - (count - 1) / 2) * 1.25; + const px = x + (alongX ? offset : 0), pz = z + (alongX ? 0 : offset); + const bag = new THREE.Mesh(new THREE.CapsuleGeometry(0.42, 0.72, 3, 7), M.sandbag); + bag.rotation.z = Math.PI / 2; bag.rotation.y = ry; bag.scale.z = 0.68; + bag.position.set(px, 0.38, pz); bag.castShadow = true; bag.receiveShadow = true; root.add(bag); occluders.push(bag); + } + const w = alongX ? count * 1.25 : 0.9, d = alongX ? 0.9 : count * 1.25; + colliders.push({ minX: x - w / 2, maxX: x + w / 2, minY: 0, maxY: 0.85, minZ: z - d / 2, maxZ: z + d / 2 }); + } + sandbagWall(-9, -3, 6, true); sandbagWall(10, 3, 6, true); + sandbagWall(-20, 5, 5, false, Math.PI / 2); sandbagWall(21, -6, 5, false, Math.PI / 2); + sandbagWall(-5, 27, 5, true); sandbagWall(6, -28, 5, true); + + function crate(x, z, size = 1.8, h = 1.6) { + const m = addBox(size, h, size, M.wood, x, 0, z, { name: 'caixa-suprimentos' }); + for (const y of [0.18, h - 0.18]) { + addBox(size + 0.05, 0.14, 0.12, M.darkWood, x, y, z + size / 2 + 0.02, { collide: false, occlude: false }); + addBox(size + 0.05, 0.14, 0.12, M.darkWood, x, y, z - size / 2 - 0.02, { collide: false, occlude: false }); + } + return m; + } + [[-7,-27],[8,27],[-24,-18],[24,18],[-7,7],[8,-8],[-30,18],[30,-19]].forEach(([x,z], i) => crate(x, z, i % 3 ? 1.7 : 2.1, i % 2 ? 1.45 : 1.8)); + [ + [-17,-29],[-12,-23],[-3,-30],[4,-25],[12,-30],[18,-23], + [-18,23],[-12,30],[-4,25],[3,30],[12,23],[17,29], + ].forEach(([x,z], i) => crate(x, z, 1.35 + (i % 2) * 0.2, 1.05 + (i % 3) * 0.12)); + + function tree(x, z, scale = 1) { + addCylinder(0.26 * scale, 0.38 * scale, 4.8 * scale, 7, M.trunk, x, 0, z, true); + for (let i = 0; i < 3; i++) { + const crown = new THREE.Mesh(new THREE.DodecahedronGeometry((1.65 - i * 0.15) * scale, 1), i % 2 ? M.leafLight : M.leaf); + crown.position.set(x + (i - 1) * 0.65 * scale, (4.3 + i * 0.55) * scale, z + (i % 2 ? 0.55 : -0.35) * scale); + crown.scale.y = 0.72; crown.castShadow = true; root.add(crown); + } + } + function undergrowth(x, z, scale = 1) { + const group = new THREE.Group(); group.position.set(x, 0.05, z); root.add(group); + for (let i = 0; i < 7; i++) { + const leaf = new THREE.Mesh(new THREE.ConeGeometry(0.28 * scale, (0.9 + (i % 3) * 0.18) * scale, 4), i % 2 ? M.leafLight : M.leaf); + const a = i * Math.PI * 2 / 7; + leaf.position.set(Math.cos(a) * 0.32 * scale, 0.35 * scale, Math.sin(a) * 0.32 * scale); + leaf.rotation.z = (i % 2 ? 0.38 : -0.34); leaf.rotation.y = -a; leaf.castShadow = true; group.add(leaf); + } + } + function rock(x, z, sx = 1, sy = 1, sz = 1) { + const mesh = new THREE.Mesh(new THREE.DodecahedronGeometry(1.15, 0), M.stone); + mesh.scale.set(sx, sy, sz); mesh.position.set(x, sy * 0.85, z); mesh.rotation.set(0.12, x * 0.17, -0.08); + mesh.castShadow = true; mesh.receiveShadow = true; root.add(mesh); occluders.push(mesh); + colliders.push({ minX: x - sx, maxX: x + sx, minY: 0, maxY: sy * 1.8, minZ: z - sz, maxZ: z + sz }); + } + const TREES = [[-37,-34],[37,-34],[-37,34],[37,34],[-31,-27],[31,-27],[-31,27],[31,27],[-38,-9],[38,10],[-25,37],[25,-37],[-36,19],[36,-18],[-39,-23],[39,24],[-14,39],[14,-39],[-40,2],[40,-3],[-27,-39],[28,39]]; + TREES.forEach(([x,z], i) => tree(x, z, 0.85 + (i % 4) * 0.08)); + const SHRUBS = [ + [-34,-13],[-33,12],[34,-12],[33,13],[-25,-22],[25,22],[-23,25],[23,-25], + [-17,4],[18,-4],[-9,21],[10,-21],[-5,-5],[5,6],[-30,31],[30,-31], + [-35,-29],[-29,-34],[-35,-19],[-29,-12],[-36,6],[-29,16],[-35,26],[-27,35], + [-18,-34],[-12,-25],[-20,-10],[-11,-2],[-19,11],[-11,24],[-18,33],[-7,30], + [18,-34],[12,-25],[20,-10],[11,-2],[19,11],[11,24],[18,33],[7,30], + [35,-29],[29,-34],[35,-19],[29,-12],[36,6],[29,16],[35,26],[27,35], + ]; + SHRUBS.forEach(([x,z], i) => undergrowth(x, z, 0.68 + (i % 4) * 0.12)); + [[-22,-8,1.4,1.1,1.0],[23,9,1.2,0.9,1.4],[-10,5,1.0,0.75,1.2],[11,-5,1.2,0.85,1.0],[-34,24,1.5,1.2,1.2],[34,-25,1.4,1.0,1.5]].forEach((v) => rock(...v)); + [ + [-35,-31],[-30,-24],[-24,-35],[-36,-22],[-35,31],[-30,24],[-24,35],[-36,21], + [35,-31],[30,-24],[24,-35],[36,-21],[35,31],[30,24],[24,35],[36,22], + [-34,-14],[-34,14],[34,-14],[34,14], + [-17,-9],[-9,-18],[-17,9],[-9,18],[17,-9],[9,-18],[17,9],[9,18], + [-7,-35],[7,-35],[-7,35],[7,35], + [-30,-6],[-15,-26],[-5,-22],[-14,26],[14,-26],[15,26],[5,22], + ].forEach(([x,z], i) => rock(x, z, 0.58 + (i % 3) * 0.12, 0.42 + (i % 2) * 0.14, 0.62 + (i % 4) * 0.08)); + + function tower(id, x, z, direction) { + const topY = TOWER_TOP; + for (const sx of [-1, 1]) for (const sz of [-1, 1]) addBox(0.42, topY, 0.42, M.darkWood, x + sx * 3.2, 0, z + sz * 3.2, { name: `${id}-poste` }); + const deck = addBox(7.5, 0.35, 7.5, M.towerWood, x, topY - 0.18, z, { collide: false, name: `${id}-piso` }); + deck.userData.vietnamTower = id; + const outerX = x + direction * 3.55; + addBox(0.25, 2.2, 7.2, M.towerBamboo, outerX, topY, z, { name: `${id}-parede` }); + addBox(5.2, 1.15, 0.22, M.towerBamboo, x + direction * 0.8, topY + 1.05, z - 3.48, { name: `${id}-parapeito` }); + addBox(5.2, 1.15, 0.22, M.towerBamboo, x + direction * 0.8, topY + 1.05, z + 3.48, { name: `${id}-parapeito` }); + const roof = addBox(8.3, 0.22, 8.3, M.metal, x, topY + 3.25, z, { collide: false, name: `${id}-telhado` }); + roof.rotation.z = direction * 0.05; + const roofBottom = topY + 3.25; + for (const sx of [-1, 1]) for (const sz of [-1, 1]) { + addBox(0.34, roofBottom - topY, 0.34, M.towerWood, x + sx * 3.2, topY, z + sz * 3.2, + { name: `${id}-coluna-telhado` }); + } + for (const sz of [-1, 1]) { + addBox(6.75, 0.3, 0.3, M.towerWood, x, roofBottom - 0.3, z + sz * 3.2, + { name: `${id}-viga-lateral` }); + const braceLength = Math.hypot(5.6, 2.7); + addBox(braceLength, 0.18, 0.16, M.darkWood, x, topY + 1.35, z + sz * 3.22, + { collide: false, occlude: false, rz: sz * Math.atan2(2.7, 5.6), name: `${id}-contraventamento` }); + } + for (const sx of [-1, 1]) { + addBox(0.3, 0.3, 6.75, M.towerWood, x + sx * 3.2, roofBottom - 0.3, z, + { name: `${id}-viga-lateral` }); + const braceLength = Math.hypot(5.6, 2.7); + addBox(0.16, 0.18, braceLength, M.darkWood, x + sx * 3.22, topY + 1.35, z, + { collide: false, occlude: false, rx: sx * Math.atan2(2.7, 5.6), name: `${id}-contraventamento` }); + } + + const startX = x - direction * 11; + const endX = x - direction * 4.0; + const run = Math.abs(endX - startX); + const length = Math.hypot(run, topY); + const slope = Math.atan2(topY, run); + const ramp = addBox(length, 0.24, 3.6, M.towerWood, (startX + endX) / 2, topY / 2 - 0.12, z, + { collide: false, name: `${id}-rampa`, rz: direction * slope }); + ramp.userData.vietnamRamp = { towerId: id, start: { x: startX, z }, end: { x: endX, z }, topY }; + for (const dz of [-1.72, 1.72]) { + const rail = addBox(length, 0.16, 0.14, M.darkWood, (startX + endX) / 2, topY / 2 + 0.42, z + dz, + { collide: false, occlude: false, rz: direction * slope }); + rail.castShadow = false; + } + } + tower('guarita-oeste', -30, 0, -1); + tower('guarita-leste', 30, 0, 1); + + function smokePlume(x, z, scale = 1) { + for (let i = 0; i < 7; i++) { + const puff = new THREE.Mesh(new THREE.SphereGeometry((1.2 + i * 0.28) * scale, 12, 8), M.smoke); + puff.position.set(x + Math.sin(i * 1.7) * 0.8, 2.1 + i * 1.35, z + Math.cos(i * 1.3) * 0.55); + puff.scale.set(1.35, 0.8, 1); puff.rotation.y = i * 0.74; scene.add(puff); + } + } + smokePlume(-37, -17, 0.9); + smokePlume(36, 23, 0.72); + + function barrel(x, z, color) { + const mat = new THREE.MeshLambertMaterial({ color }); + const b = addCylinder(0.48, 0.48, 1.15, 16, mat, x, 0, z, true); b.name = 'tambor-metal'; + for (const y of [0.18, 0.92]) { const ring = new THREE.Mesh(new THREE.TorusGeometry(0.49, 0.035, 6, 16), M.steel); ring.rotation.x = Math.PI / 2; ring.position.set(x, y, z); root.add(ring); } + } + [[-18,-27,0x3d6042],[18,27,0x766029],[-18,25,0x5d4932],[18,-25,0x3f5650],[-5,-12,0x66552c],[6,12,0x3d6042]].forEach((v) => barrel(...v)); + + function insideRamp(r, x, z) { + const dx = r.end.x - r.start.x, dz = r.end.z - r.start.z; + const len2 = dx * dx + dz * dz; + const t = ((x - r.start.x) * dx + (z - r.start.z) * dz) / len2; + const px = r.start.x + Math.max(0, Math.min(1, t)) * dx; + const pz = r.start.z + Math.max(0, Math.min(1, t)) * dz; + return { t, distance: Math.hypot(x - px, z - pz) }; + } + const rampDefs = [ + { towerId: 'guarita-oeste', start: { x: -19, z: 0 }, end: { x: -26, z: 0 }, topY: TOWER_TOP, platform: { x: -30, z: 0 } }, + { towerId: 'guarita-leste', start: { x: 19, z: 0 }, end: { x: 26, z: 0 }, topY: TOWER_TOP, platform: { x: 30, z: 0 } }, + ]; + function groundHeightAt(x, z) { + for (const r of rampDefs) { + const p = insideRamp(r, x, z); + if (p.t >= 0 && p.t <= 1 && p.distance <= 1.72) return r.topY * p.t; + if (Math.abs(x - r.platform.x) <= 3.7 && Math.abs(z - r.platform.z) <= 3.7) return r.topY; + } + return 0; + } + const slowAt = (x, z) => Math.abs(x) < 3.25 && Math.abs(z) < 31; + + const gunMat = { dark: M.black, wood: M.darkWood, steel: M.steel }; + function gun(kind, x, z, yaw = 0) { + const g = new THREE.Group(); + const receiver = new THREE.Mesh(new THREE.BoxGeometry(0.14, 0.16, kind === 'deagle' ? 0.45 : 0.92), gunMat.dark); + receiver.position.y = 0.13; g.add(receiver); + const stock = new THREE.Mesh(new THREE.BoxGeometry(0.16, 0.22, 0.32), kind === 'ak' || kind === 'shotgun' ? gunMat.wood : gunMat.dark); + stock.position.set(0, 0.11, 0.5); g.add(stock); + const barrelMesh = new THREE.Mesh(new THREE.CylinderGeometry(0.035, 0.035, kind === 'awp' ? 0.7 : 0.45, 8), gunMat.steel); + barrelMesh.rotation.x = Math.PI / 2; barrelMesh.position.set(0, 0.14, -0.62); g.add(barrelMesh); + g.position.set(x, groundHeightAt(x, z) + 0.04, z); g.rotation.y = yaw; g.name = `pickup-${kind}`; + g.traverse((o) => { if (o.isMesh) o.castShadow = true; }); root.add(g); + pickups.push({ x, z, kind, weapon: kind, readyAt: 0, mesh: g }); + } + const arsenal = ['awp', 'ak', 'm4', 'shotgun', 'mp5', 'deagle', 'pistol', 'g3', 'uzi']; + arsenal.forEach((kind, i) => gun(kind, -16 + i * 4, -34, 0)); + arsenal.forEach((kind, i) => gun(kind, 16 - i * 4, 34, Math.PI)); + gun('ak', -16.5, 0, Math.PI / 2); gun('m4', 16.5, 0, -Math.PI / 2); + + const bounds = { minX: -HALF + 1.5, maxX: HALF - 1.5, minZ: -HALF + 1.5, maxZ: HALF - 1.5 }; + const nodes = [], adj = []; + const STEP = 3; + const blocked = (x, z, inflate = 0.48) => colliders.some((c) => x > c.minX - inflate && x < c.maxX + inflate && z > c.minZ - inflate && z < c.maxZ + inflate && c.minY < 1.6 && c.maxY > 0.15); + for (let x = -39; x <= 39; x += STEP) for (let z = -39; z <= 39; z += STEP) if (!blocked(x, z)) nodes.push({ x, z }); + const clear = (a, b) => { + for (let k = 1; k < 8; k++) { + const t = k / 8; + if (blocked(a.x + (b.x - a.x) * t, a.z + (b.z - a.z) * t, 0.28)) return false; + } + return Math.abs(groundHeightAt(a.x, a.z) - groundHeightAt(b.x, b.z)) <= 1.45; + }; + for (let i = 0; i < nodes.length; i++) adj[i] = []; + for (let i = 0; i < nodes.length; i++) { + for (let j = i + 1; j < nodes.length; j++) { + const dx = nodes[i].x - nodes[j].x, dz = nodes[i].z - nodes[j].z; + if (dx * dx + dz * dz <= STEP * STEP * 2.05 && clear(nodes[i], nodes[j])) { adj[i].push(j); adj[j].push(i); } + } + } + function nearestWaypoint(x, z) { + let best = 0, bestD = Infinity; + for (let i = 0; i < nodes.length; i++) { + const dx = nodes[i].x - x, dz = nodes[i].z - z, d = dx * dx + dz * dz; + if (d < bestD) { bestD = d; best = i; } + } + return best; + } + function findPath(fromIdx, toIdx) { + if (fromIdx === toIdx) return [fromIdx]; + const prev = new Int32Array(nodes.length).fill(-1), queue = [fromIdx]; prev[fromIdx] = fromIdx; + for (let h = 0; h < queue.length; h++) { + const n = queue[h]; + for (const next of adj[n]) if (prev[next] < 0) { + prev[next] = n; + if (next === toIdx) { + const path = [next]; let cur = n; + while (cur !== fromIdx) { path.unshift(cur); cur = prev[cur]; } + path.unshift(fromIdx); return path; + } + queue.push(next); + } + } + return [fromIdx]; + } + + scene.background = new THREE.Color(0x1c252d); + scene.fog = new THREE.Fog(0x374047, 44, 96); + const hemi = new THREE.HemisphereLight(0xabb7bb, 0x2d3328, 1.16); scene.add(hemi); + const sun = new THREE.DirectionalLight(0xebdabe, 1.18); sun.position.set(-26, 48, -20); sun.castShadow = true; + sun.shadow.mapSize.set(2048, 2048); sun.shadow.camera.left = -50; sun.shadow.camera.right = 50; + sun.shadow.camera.top = 50; sun.shadow.camera.bottom = -50; sun.shadow.camera.far = 150; sun.shadow.bias = -0.0004; scene.add(sun); + + const spawns = { + E: [-12, -4, 4, 12].map((x) => ({ x, z: -36.5, yaw: 0 })), + B: [12, 4, -4, -12].map((x) => ({ x, z: 36.5, yaw: Math.PI })), + }; + return { + root, colliders, occluders, decalSolids: [root], spawns, bounds, pickups, sun, hemi, + groundHeightAt, slowAt, + ctfPoints: [ + { id: 'E', label: 'TRILHA SUL', x: -14, z: -29 }, + { id: 'MID', label: 'VILAREJO', x: 8, z: 0 }, + { id: 'B', label: 'TRILHA NORTE', x: 14, z: 29 }, + ], + waypoints: { nodes, adj }, nearestWaypoint, findPath, + }; +} diff --git a/public/js/maps.js b/public/js/maps.js index 770cf7950..986f52c10 100644 --- a/public/js/maps.js +++ b/public/js/maps.js @@ -6,6 +6,7 @@ import { buildFerroVelho, FERRO_PROPS } from './map_ferrovelho.js'; import { buildQuebrada, QUEBRADA_PROPS } from './map_quebrada.js'; import { buildPosto, POSTO_PROPS } from './map_posto.js'; import { buildAtacadao, ATACADAO_PROPS } from './map_atacadao.js'; +import { buildTretaVietnam } from './map_treta_vietnan.js'; /* IDS SEM NOME DE COUNTER-STRIKE (rodada de 11/08). ═══════════════════════════════════════════════════════════════════════════════════ @@ -62,6 +63,7 @@ export const MAPS = { // por portas de verdade na fachada. Gôndolas reais (gondola_mercado/eletro), caixas, doca, e um // bairro/skyline em volta. A treta é o preço absurdo. Simétrico funcional, A* pelos corredores. atacadao_treta: { name: 'Atacadão da Treta', build: buildAtacadao, props: ATACADAO_PROPS, ctfMode: true }, + treta_vietnan: { name: 'Treta no Vietnã', build: buildTretaVietnam }, }; export const MAP_IDS = Object.keys(MAPS); export const DEFAULT_MAP = 'praca_poderes'; diff --git a/src/data/jogo.ts b/src/data/jogo.ts index 56eac74d6..96f4c2996 100644 --- a/src/data/jogo.ts +++ b/src/data/jogo.ts @@ -171,6 +171,14 @@ export const MAPAS: Mapa[] = [ 'impede a rua virar corredor de sniper. Quatro bandeiras: campinho, bar de esquina, ponto de ' + 'ônibus e praça do baile.', }, + { + id: 'treta_vietnan', nome: 'Treta no Vietnã', modo: 'Rounds · padrão', ctf: false, + resumo: 'Arena de selva úmida com vilarejo de madeira, barreiras e guaritas elevadas.', + detalhe: 'Três rotas atravessam vegetação tropical, cabanas, pontes e coberturas improvisadas. ' + + 'Duas rampas largas dão acesso às guaritas laterais, criando posições elevadas sobre o centro ' + + 'sem controlar todas as rotas. O riacho desacelera a travessia central, enquanto ' + + 'os flancos secos favorecem avanço rápido entre árvores, caixas e barreiras de sacos de areia.', + }, ]; export interface Personagem { faccao: string; nome: string; blurb: string; } diff --git a/src/pages/maps.astro b/src/pages/maps.astro index 9eb0acea6..077a8a864 100644 --- a/src/pages/maps.astro +++ b/src/pages/maps.astro @@ -52,6 +52,14 @@ const MAP_EN: Record 'that keeps the street from becoming a sniper corridor. Four flags: dirt pitch, corner bar, ' + 'bus stop and baile square.', }, + treta_vietnan: { + nome: 'Fight in Vietnam', + resumo: 'A humid jungle arena with a wooden village, barriers and elevated guard towers.', + detalhe: 'Three routes cross tropical vegetation, huts, bridges and improvised cover. Two wide ' + + 'ramps lead to the side guard towers, creating elevated positions over mid without controlling ' + + 'every route. The stream slows the central crossing, while the dry flanks reward ' + + 'fast pushes through trees, crates, rocks and sandbag barriers.', + }, }; const en = (id: string) => MAP_EN[id]; diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index 6b2534269..4f8a79ef0 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -10,7 +10,7 @@ | Arquivo | Linhas | Símbolos | |---|---:|---:| | `public/js/game.js` | 6561 | 230 | -| `public/js/main.js` | 2513 | 230 | +| `public/js/main.js` | 2515 | 230 | | `public/js/glbchars.js` | 838 | 60 | | `public/js/characters.js` | 1069 | 40 | | `public/js/vmattach.js` | 629 | 4 | diff --git a/tools/eval/g2ui-map-previews.mjs b/tools/eval/g2ui-map-previews.mjs index d8cc25670..bff152dcf 100644 --- a/tools/eval/g2ui-map-previews.mjs +++ b/tools/eval/g2ui-map-previews.mjs @@ -45,6 +45,8 @@ const POSES = process.env.POSES ? JSON.parse(process.env.POSES) : { // Rua inteira do campinho até a rotunda do baile, comércio dos dois lados, faixa na // frente. Câmera alta e pitch fundo porque a -0,17 metade do cartaz era céu. quebrada: { pos: [0, 8.0, 30], pitch: -0.30, yaw: 0.0 }, + // Vilarejo central enquadrado entre as duas guaritas, com mata e ponte em profundidade. + treta_vietnan: { pos: [0, 8.5, 26], pitch: -0.26, yaw: -0.4 }, }; const NOPOSE = process.env.NOPOSE === '1'; // captura do spawn, sem pino de posição const TAG = process.env.TAG || ''; @@ -66,7 +68,9 @@ if (process.argv[2] === '--write') { const LIST = (process.argv[2] || 'praca_poderes,piscina_treta,loja_h,ferro_velho,quebrada').split(','); const YAWS = (process.argv[3] || '-2.4,-1.8,-1.2,-0.6,0,0.6,1.2,1.8,2.4,3.0').split(',').map(Number); const gRoot = execSync('npm root -g').toString().trim(); -const _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); +let _pw; +try { _pw = await import('playwright'); } +catch { _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); } const chromium = _pw.chromium || _pw.default?.chromium; mkdirSync(OUT, { recursive: true }); @@ -89,7 +93,7 @@ page.on('pageerror', e => { errors++; console.error('[pageerror]', e.message); } for (const mapId of LIST) { await page.goto(`${BASE}/?debug=1&auto=P,mst&map=${mapId}`, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForFunction(() => window.__game && window.__game.state === 'live', null, { timeout: 180000 }); - await page.addStyleTag({ content: '#hud{display:none!important}' }); + await page.addStyleTag({ content: '#hud,astro-dev-toolbar{display:none!important}' }); await page.evaluate((pose) => { const g = window.__game; g.player.hp = 1e9; @@ -118,6 +122,11 @@ for (const mapId of LIST) { if (gg.vmScene) gg.vmScene.visible = false; for (const b of gg.bots || []) if (b.mesh?.group) mute(b.mesh.group); if (gg.drops) for (const d of gg.drops) if (d.mesh) mute(d.mesh); + if (window.__pin.pos && gg.camera && gg.renderer) { + gg.camera.position.set(window.__pin.pos[0], window.__pin.pos[1] + 1.62, window.__pin.pos[2]); + gg.camera.rotation.set(window.__pin.pitch, window.__pin.yaw, 0); + gg.renderer.render(gg.scene, gg.camera); + } } requestAnimationFrame(tick); }; diff --git a/tools/eval/map_check.json b/tools/eval/map_check.json index f3357fd12..4c89faa60 100644 --- a/tools/eval/map_check.json +++ b/tools/eval/map_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:27:43.781Z", + "gerado": "2026-08-19T01:33:17.318Z", "criterios": { "map1": "corpo dentro de sólido: raycast do peito (1.4 m) até o chão; sólido com topo > 0.3 m acima do chão local reprova", "map2": "exposição: fração dos pontos andáveis a ≥ 25 m com _losClear até a cabeça (1.62 m) de quem nasce", @@ -6769,6 +6769,581 @@ } ], "alturaTrianguloMin": 18 + }, + { + "map": "treta_vietnan", + "celulasAlcancadas": 91060, + "amostrasChao": 5643, + "observadores": 1406, + "corpoDentroDeSolido": 0, + "submersosAcimaDoPeito": 0, + "piorPenetracao": 0, + "piores": [], + "dentroTodos": [], + "spawns": [ + { + "team": "E", + "x": -12, + "z": -36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": -4, + "z": -36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 4, + "z": -36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "E", + "x": 12, + "z": -36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 12, + "z": 36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": 4, + "z": 36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -4, + "z": 36.5, + "chao": 0, + "penetracao": 0 + }, + { + "team": "B", + "x": -12, + "z": 36.5, + "chao": 0, + "penetracao": 0 + } + ], + "exposicaoPorTime": [ + { + "team": "E", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1664, + "maiorVisada": 91.2 + }, + { + "team": "B", + "chaoMin": 0, + "chaoMax": 0, + "fracMedia": 0.1596, + "maiorVisada": 87.2 + } + ], + "exposicaoPorSpawn": [ + { + "team": "E", + "x": -12, + "z": -36.5, + "chao": 0, + "obsLonge": 1157, + "obsVendo": 203, + "frac": 0.1755, + "maiorVisada": 82.1 + }, + { + "team": "E", + "x": -4, + "z": -36.5, + "chao": 0, + "obsLonge": 1158, + "obsVendo": 149, + "frac": 0.1287, + "maiorVisada": 59.1 + }, + { + "team": "E", + "x": 4, + "z": -36.5, + "chao": 0, + "obsLonge": 1158, + "obsVendo": 135, + "frac": 0.1166, + "maiorVisada": 58.1 + }, + { + "team": "E", + "x": 12, + "z": -36.5, + "chao": 0, + "obsLonge": 1155, + "obsVendo": 283, + "frac": 0.245, + "maiorVisada": 91.2 + }, + { + "team": "B", + "x": 12, + "z": 36.5, + "chao": 0, + "obsLonge": 1147, + "obsVendo": 241, + "frac": 0.2101, + "maiorVisada": 87.2 + }, + { + "team": "B", + "x": 4, + "z": 36.5, + "chao": 0, + "obsLonge": 1147, + "obsVendo": 132, + "frac": 0.1151, + "maiorVisada": 58.9 + }, + { + "team": "B", + "x": -4, + "z": 36.5, + "chao": 0, + "obsLonge": 1150, + "obsVendo": 164, + "frac": 0.1426, + "maiorVisada": 66.1 + }, + { + "team": "B", + "x": -12, + "z": 36.5, + "chao": 0, + "obsLonge": 1149, + "obsVendo": 196, + "frac": 0.1706, + "maiorVisada": 84.5 + } + ], + "salaDoSpawn": [ + { + "team": "E", + "x": -12, + "z": -36.5, + "folgaParede": 3.75, + "dirPior": 84, + "areaContigua": 62.6, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": -4, + "z": -36.5, + "folgaParede": 2.5, + "dirPior": 158, + "areaContigua": 66.2, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 4, + "z": -36.5, + "folgaParede": 2.4, + "dirPior": 23, + "areaContigua": 59.1, + "okFolga": true, + "okArea": true + }, + { + "team": "E", + "x": 12, + "z": -36.5, + "folgaParede": 2.8, + "dirPior": 309, + "areaContigua": 66.7, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 12, + "z": 36.5, + "folgaParede": 4.4, + "dirPior": 191, + "areaContigua": 68.3, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": 4, + "z": 36.5, + "folgaParede": 2.45, + "dirPior": 343, + "areaContigua": 59.1, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -4, + "z": 36.5, + "folgaParede": 2.55, + "dirPior": 197, + "areaContigua": 66.2, + "okFolga": true, + "okArea": true + }, + { + "team": "B", + "x": -12, + "z": 36.5, + "folgaParede": 2.85, + "dirPior": 129, + "areaContigua": 61.3, + "okFolga": true, + "okArea": true + } + ], + "piorFolga": 2.4, + "piorArea": 59.1, + "escadas": [], + "travessia": [], + "occluderSemMalha": [], + "occMedidos": 221, + "occPulados": 0, + "fracSemMalha": 0.0031, + "quadrantes": [ + { + "q": "0,0", + "x0": -40.5, + "z0": -40.5, + "areaAndavel": 366, + "props": 8, + "waypoints": 44, + "densProp": 2.18, + "densWp": 12.02, + "espacamento": 6.77, + "razaoProp": 0.81, + "razaoWp": 1.11 + }, + { + "q": "0,1", + "x0": -40.5, + "z0": -20.3, + "areaAndavel": 350, + "props": 10, + "waypoints": 36, + "densProp": 2.86, + "densWp": 10.29, + "espacamento": 5.91, + "razaoProp": 1.06, + "razaoWp": 0.95 + }, + { + "q": "0,2", + "x0": -40.5, + "z0": 0, + "areaAndavel": 352, + "props": 10, + "waypoints": 45, + "densProp": 2.84, + "densWp": 12.77, + "espacamento": 5.94, + "razaoProp": 1.05, + "razaoWp": 1.18 + }, + { + "q": "0,3", + "x0": -40.5, + "z0": 20.3, + "areaAndavel": 359, + "props": 8, + "waypoints": 44, + "densProp": 2.23, + "densWp": 12.27, + "espacamento": 6.7, + "razaoProp": 0.83, + "razaoWp": 1.13 + }, + { + "q": "1,0", + "x0": -20.3, + "z0": -40.5, + "areaAndavel": 347, + "props": 10, + "waypoints": 31, + "densProp": 2.88, + "densWp": 8.94, + "espacamento": 5.89, + "razaoProp": 1.07, + "razaoWp": 0.82 + }, + { + "q": "1,1", + "x0": -20.3, + "z0": -20.3, + "areaAndavel": 361, + "props": 8, + "waypoints": 28, + "densProp": 2.22, + "densWp": 7.76, + "espacamento": 6.71, + "razaoProp": 0.82, + "razaoWp": 0.71 + }, + { + "q": "1,2", + "x0": -20.3, + "z0": 0, + "areaAndavel": 352, + "props": 9, + "waypoints": 33, + "densProp": 2.56, + "densWp": 9.37, + "espacamento": 6.26, + "razaoProp": 0.95, + "razaoWp": 0.86 + }, + { + "q": "1,3", + "x0": -20.3, + "z0": 20.3, + "areaAndavel": 349, + "props": 10, + "waypoints": 32, + "densProp": 2.87, + "densWp": 9.17, + "espacamento": 5.91, + "razaoProp": 1.06, + "razaoWp": 0.84 + }, + { + "q": "2,0", + "x0": 0, + "z0": -40.5, + "areaAndavel": 345, + "props": 10, + "waypoints": 42, + "densProp": 2.9, + "densWp": 12.18, + "espacamento": 5.87, + "razaoProp": 1.08, + "razaoWp": 1.12 + }, + { + "q": "2,1", + "x0": 0, + "z0": -20.3, + "areaAndavel": 366, + "props": 8, + "waypoints": 35, + "densProp": 2.19, + "densWp": 9.57, + "espacamento": 6.76, + "razaoProp": 0.81, + "razaoWp": 0.88 + }, + { + "q": "2,2", + "x0": 0, + "z0": 0, + "areaAndavel": 358, + "props": 8, + "waypoints": 38, + "densProp": 2.24, + "densWp": 10.62, + "espacamento": 6.69, + "razaoProp": 0.83, + "razaoWp": 0.98 + }, + { + "q": "2,3", + "x0": 0, + "z0": 20.3, + "areaAndavel": 352, + "props": 10, + "waypoints": 39, + "densProp": 2.84, + "densWp": 11.09, + "espacamento": 5.93, + "razaoProp": 1.05, + "razaoWp": 1.02 + }, + { + "q": "3,0", + "x0": 20.3, + "z0": -40.5, + "areaAndavel": 358, + "props": 8, + "waypoints": 44, + "densProp": 2.23, + "densWp": 12.28, + "espacamento": 6.69, + "razaoProp": 0.83, + "razaoWp": 1.13 + }, + { + "q": "3,1", + "x0": 20.3, + "z0": -20.3, + "areaAndavel": 353, + "props": 10, + "waypoints": 34, + "densProp": 2.83, + "densWp": 9.63, + "espacamento": 5.94, + "razaoProp": 1.05, + "razaoWp": 0.89 + }, + { + "q": "3,2", + "x0": 20.3, + "z0": 0, + "areaAndavel": 351, + "props": 10, + "waypoints": 44, + "densProp": 2.85, + "densWp": 12.54, + "espacamento": 5.92, + "razaoProp": 1.06, + "razaoWp": 1.16 + }, + { + "q": "3,3", + "x0": 20.3, + "z0": 20.3, + "areaAndavel": 373, + "props": 8, + "waypoints": 44, + "densProp": 2.14, + "densWp": 11.79, + "espacamento": 6.83, + "razaoProp": 0.79, + "razaoWp": 1.09 + } + ], + "medianaProp": 2.6950000000000003, + "medianaWp": 10.855, + "piorRazaoProp": 0.79, + "piorRazaoWp": 0.71, + "piorEspacamento": 6.83, + "rotasSpawnBandeira": [ + { + "time": "E", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 11.5, + 11.5, + 11.5, + 11.5 + ] + }, + { + "time": "E", + "bandeira": "MID", + "rotas": 3, + "comprimentos": [ + 51.4, + 54.9, + 77.2 + ] + }, + { + "time": "E", + "bandeira": "B", + "rotas": 3, + "comprimentos": [ + 83.9, + 92.4, + 106.2 + ] + }, + { + "time": "B", + "bandeira": "E", + "rotas": 4, + "comprimentos": [ + 77.2, + 91.7, + 95.9, + 137.6 + ] + }, + { + "time": "B", + "bandeira": "MID", + "rotas": 4, + "comprimentos": [ + 44, + 48.2, + 72.9, + 78.9 + ] + }, + { + "time": "B", + "bandeira": "B", + "rotas": 4, + "comprimentos": [ + 11.5, + 11.5, + 11.5, + 11.5 + ] + } + ], + "piorRotas": 3, + "bandeiras": [ + { + "id": "E", + "label": "TRILHA SUL", + "x": -14, + "z": -29, + "distSpawn": 7.76, + "timeSpawn": "E", + "maiorLinhaTiro": 86.9, + "chao": 0, + "penetracao": 0 + }, + { + "id": "MID", + "label": "VILAREJO", + "x": 8, + "z": 0, + "distSpawn": 36.72, + "timeSpawn": "E", + "maiorLinhaTiro": 56.6, + "chao": 0, + "penetracao": 0 + }, + { + "id": "B", + "label": "TRILHA NORTE", + "x": 14, + "z": 29, + "distSpawn": 7.76, + "timeSpawn": "B", + "maiorLinhaTiro": 84.3, + "chao": 0, + "penetracao": 0 + } + ], + "alturaTrianguloMin": 7.2 } ] } \ No newline at end of file diff --git a/tools/eval/pickup_check.json b/tools/eval/pickup_check.json index 62407ba40..3bda8fc5a 100644 --- a/tools/eval/pickup_check.json +++ b/tools/eval/pickup_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-16T03:26:37.943Z", + "gerado": "2026-08-19T01:33:19.914Z", "criterios": { "chaoMinimoM": -0.1, "vaoMaximoM": 0.05, @@ -9,7 +9,7 @@ "reta": "reta andável de um spawn do time" } }, - "totalPickups": 440, + "totalPickups": 510, "semAlcance": 0, "abaixoDoPiso": 0, "flutuando": 0, @@ -8499,6 +8499,1354 @@ "okAssentada": true } ] + }, + { + "map": "treta_vietnan", + "waypoints": 613, + "pickups": 70, + "spawnPiorDistWaypoint": 1.12, + "celulasAlcancadas": 91060, + "semAlcance": 0, + "semAlcanceWpVelho": 0, + "semAlcanceRetaVelho": 5, + "piorDistAndavel": 0.25, + "abaixoDoPiso": 0, + "flutuando": 0, + "piorDistWaypoint": 2.89, + "piorChao": 0, + "piorVao": 0.01, + "itens": [ + { + "arma": "awp", + "fonte": "mapa", + "x": -16, + "z": -34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": -12, + "z": -34, + "chao": 0, + "distWaypoint": 2, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": -8, + "z": -34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": -4, + "z": -34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "mapa", + "x": 0, + "z": -34, + "chao": 0, + "distWaypoint": 1, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "mapa", + "x": 4, + "z": -34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "mapa", + "x": 8, + "z": -34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.25, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "mapa", + "x": 12, + "z": -34, + "chao": 0, + "distWaypoint": 1, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "mapa", + "x": 16, + "z": -34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "mapa", + "x": 16, + "z": 34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": 12, + "z": 34, + "chao": 0, + "distWaypoint": 1, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": 8, + "z": 34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.25, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "mapa", + "x": 4, + "z": 34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "mapa", + "x": 0, + "z": 34, + "chao": 0, + "distWaypoint": 1, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "mapa", + "x": -4, + "z": 34, + "chao": 0, + "distWaypoint": 1.41, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "mapa", + "x": -8, + "z": 34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "mapa", + "x": -12, + "z": 34, + "chao": 0, + "distWaypoint": 2, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "mapa", + "x": -16, + "z": 34, + "chao": 0, + "distWaypoint": 2.24, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "mapa", + "x": -16.5, + "z": 0, + "chao": 0, + "distWaypoint": 1.5, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "mapa", + "x": 16.5, + "z": 0, + "chao": 0, + "distWaypoint": 1.5, + "yOrigem": 0.01, + "vaoOrigem": 0.01, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "rack", + "x": -18.9, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.27, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mosin", + "fonte": "rack", + "x": -17.75, + "z": -38.1, + "chao": 0, + "distWaypoint": 0.93, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "rem700", + "fonte": "rack", + "x": -16.6, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.66, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m400", + "fonte": "rack", + "x": -15.45, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.01, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "svd", + "fonte": "rack", + "x": -14.3, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.14, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3sg1", + "fonte": "rack", + "x": -13.15, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "sks", + "fonte": "rack", + "x": -12, + "z": -38.1, + "chao": 0, + "distWaypoint": 0.9, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "rack", + "x": -10.85, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "akm", + "fonte": "rack", + "x": -9.7, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.14, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "rack", + "x": -8.55, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.01, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "md97", + "fonte": "rack", + "x": -7.4, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.66, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "rack", + "x": -6.25, + "z": -38.1, + "chao": 0, + "distWaypoint": 0.93, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "scar", + "fonte": "rack", + "x": -5.1, + "z": -38.1, + "chao": 0, + "distWaypoint": 1.27, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "carbine", + "fonte": "rack", + "x": -18.32, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.15, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m92", + "fonte": "rack", + "x": -17.18, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.38, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "tavor", + "fonte": "rack", + "x": -16.02, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.5, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "famas", + "fonte": "rack", + "x": -14.88, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.11, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "p90", + "fonte": "rack", + "x": -13.72, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.68, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "rack", + "x": -12.57, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.24, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "rack", + "x": -11.43, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.24, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "rack", + "x": -10.28, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.68, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "lmg", + "fonte": "rack", + "x": -9.13, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.11, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "rack", + "x": -8.2, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.36, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "revolver38", + "fonte": "rack", + "x": -6.82, + "z": -33.88, + "chao": 0, + "distWaypoint": 1.21, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": false, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": false, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "rack", + "x": -5.68, + "z": -34.9, + "chao": 0, + "distWaypoint": 1.93, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "awp", + "fonte": "rack", + "x": 5.1, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.27, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mosin", + "fonte": "rack", + "x": 6.25, + "z": 38.1, + "chao": 0, + "distWaypoint": 0.93, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "rem700", + "fonte": "rack", + "x": 7.4, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.66, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m400", + "fonte": "rack", + "x": 8.55, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.01, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "svd", + "fonte": "rack", + "x": 9.7, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.14, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3sg1", + "fonte": "rack", + "x": 10.85, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "sks", + "fonte": "rack", + "x": 12, + "z": 38.1, + "chao": 0, + "distWaypoint": 0.9, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "ak", + "fonte": "rack", + "x": 13.15, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.46, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "akm", + "fonte": "rack", + "x": 14.3, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.14, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m4", + "fonte": "rack", + "x": 15.45, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.01, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "md97", + "fonte": "rack", + "x": 16.6, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.66, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "g3", + "fonte": "rack", + "x": 17.75, + "z": 38.1, + "chao": 0, + "distWaypoint": 0.93, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "scar", + "fonte": "rack", + "x": 18.9, + "z": 38.1, + "chao": 0, + "distWaypoint": 1.27, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.14, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "carbine", + "fonte": "rack", + "x": 5.68, + "z": 34.9, + "chao": 0, + "distWaypoint": 2.89, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "m92", + "fonte": "rack", + "x": 8.2, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.36, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.11, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "tavor", + "fonte": "rack", + "x": 9.13, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.11, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "famas", + "fonte": "rack", + "x": 10.28, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.68, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "p90", + "fonte": "rack", + "x": 11.43, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.24, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "mp5", + "fonte": "rack", + "x": 12.58, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.24, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "uzi", + "fonte": "rack", + "x": 13.72, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.68, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "shotgun", + "fonte": "rack", + "x": 14.88, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.11, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.16, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "lmg", + "fonte": "rack", + "x": 16.02, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.5, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "deagle", + "fonte": "rack", + "x": 17.17, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.38, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "revolver38", + "fonte": "rack", + "x": 18.32, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.15, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.13, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + }, + { + "arma": "pistol", + "fonte": "rack", + "x": 19.47, + "z": 34.9, + "chao": 0, + "distWaypoint": 1.84, + "yOrigem": 0.042, + "vaoOrigem": 0.042, + "baseMesh": 0.01, + "vao": 0.01, + "distAndavel": 0.1, + "retaDoSpawn": true, + "okAlcanceWpVelho": true, + "okAlcanceRetaVelho": true, + "okAlcance": true, + "okNivel": true, + "okAssentada": true + } + ] } ] } \ No newline at end of file diff --git a/tools/eval/telas-menu7.mjs b/tools/eval/telas-menu7.mjs index e3d606391..9a3334a71 100644 --- a/tools/eval/telas-menu7.mjs +++ b/tools/eval/telas-menu7.mjs @@ -21,7 +21,9 @@ const ONLY = process.env.ONLY ? new Set(process.env.ONLY.split(',')) : null; const want = (id) => !ONLY || ONLY.has(id); const gRoot = execSync('npm root -g').toString().trim(); -const _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); +let _pw; +try { _pw = await import('playwright'); } +catch { _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); } const chromium = _pw.chromium || _pw.default?.chromium; mkdirSync(OUT, { recursive: true }); diff --git a/tools/eval/vietnam-check.mjs b/tools/eval/vietnam-check.mjs new file mode 100644 index 000000000..559d65299 --- /dev/null +++ b/tools/eval/vietnam-check.mjs @@ -0,0 +1,175 @@ +/* Treta no Vietnã: rampas acessam guaritas, sem degrau invisível nem cenário decorativo. + * Mutantes: --mutante=sem-rampa | --mutante=rampa-plana | --mutante=clima-claro | --mutante=sem-estrutura | --mutante=escuro + */ +import { existsSync, readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { THREE, initTextures } from './harness.mjs'; + +const MUTANTE = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MAP_FILE = resolve('public/js/map_treta_vietnan.js'); +const PREVIEW = resolve('public/img/map-previews/treta_vietnan.jpg'); +const TOWER_TOP = 3.2; +const falhas = []; +const ok = (cond, msg) => { if (!cond) falhas.push(msg); }; + +if (!existsSync(MAP_FILE)) { + console.error('VIETNÃ — FALHA\n V1 arquivo public/js/map_treta_vietnan.js ausente'); + process.exit(1); +} + +const { buildTretaVietnam } = await import(`${pathToFileURL(MAP_FILE).href}?check=${Date.now()}`); +ok(typeof buildTretaVietnam === 'function', 'V1 builder buildTretaVietnam ausente'); + +if (typeof buildTretaVietnam === 'function') { + const scene = new THREE.Scene(); + const world = buildTretaVietnam(scene, await initTextures()); + scene.updateMatrixWorld(true); + + const findParts = () => { + const ramps = [], towers = []; + world.root.traverse((o) => { + if (o.userData?.vietnamRamp) ramps.push(o); + if (o.userData?.vietnamTower) towers.push(o); + }); + return { ramps, towers }; + }; + if (MUTANTE === 'sem-rampa') { + const builtRamp = findParts().ramps.at(-1); + builtRamp?.parent?.remove(builtRamp); + } + if (MUTANTE === 'rampa-plana') { + const originalGroundHeightAt = world.groundHeightAt; + world.groundHeightAt = (x, z) => { + const onRamp = Math.abs(z) <= 1.72 && Math.abs(x) >= 19 && Math.abs(x) <= 26; + return onRamp ? 0 : originalGroundHeightAt(x, z); + }; + } + scene.updateMatrixWorld(true); + const { ramps, towers } = findParts(); + if (MUTANTE === 'clima-claro') { + scene.getObjectByName('ceu-tempestade-vietnan')?.removeFromParent(); + if (world.sun) world.sun.intensity = 1.8; + } + if (MUTANTE === 'sem-estrutura') { + for (const object of [...world.root.children]) { + if (object.name.includes('-coluna-telhado')) object.removeFromParent(); + } + } + if (MUTANTE === 'escuro') { + world.hemi.intensity = 0.55; + world.sun.intensity = 0.72; + for (const ramp of ramps) ramp.material.color.setHex(0x4a3426); + } + + ok(ramps.length >= 2, `V2 rampas visíveis: ${ramps.length}, esperado >= 2`); + ok(towers.length >= 2, `V3 guaritas: ${towers.length}, esperado >= 2`); + ok(typeof world.groundHeightAt === 'function', 'V4 groundHeightAt ausente'); + + for (const ramp of ramps) { + const { start, end, topY, towerId } = ramp.userData.vietnamRamp; + ok(start && end && Number.isFinite(topY), `V4 metadados inválidos na rampa ${towerId || '?'}`); + if (!start || !end || !Number.isFinite(topY) || typeof world.groundHeightAt !== 'function') continue; + let anterior = -Infinity; + let maiorDegrau = 0; + for (let i = 0; i <= 24; i++) { + const t = i / 24; + const x = start.x + (end.x - start.x) * t; + const z = start.z + (end.z - start.z) * t; + const y = world.groundHeightAt(x, z); + if (anterior !== -Infinity) maiorDegrau = Math.max(maiorDegrau, Math.abs(y - anterior)); + ok(y + 0.01 >= anterior, `V4 rampa ${towerId} desce em t=${t.toFixed(2)}`); + + const raio = 0.38; + const bloqueiaCorpo = world.colliders.some((c) => x + raio > c.minX && x - raio < c.maxX + && z + raio > c.minZ && z - raio < c.maxZ && y + 1.75 > c.minY && y + 0.08 < c.maxY); + ok(!bloqueiaCorpo, `V5 corpo bloqueado na rampa ${towerId}, t=${t.toFixed(2)}`); + anterior = y; + } + ok(anterior >= topY - 0.12, `V4 rampa ${towerId} termina em ${anterior.toFixed(2)} m, topo ${topY}`); + ok(maiorDegrau <= 0.30, `V4 rampa ${towerId} tem degrau ${maiorDegrau.toFixed(2)} m`); + + ramp.geometry.computeBoundingBox(); + const box = ramp.geometry.boundingBox; + const endpointA = new THREE.Vector3(box.min.x, 0, 0).applyMatrix4(ramp.matrixWorld); + const endpointB = new THREE.Vector3(box.max.x, 0, 0).applyMatrix4(ramp.matrixWorld); + const low = endpointA.y < endpointB.y ? endpointA : endpointB; + const high = endpointA.y < endpointB.y ? endpointB : endpointA; + ok(Math.hypot(low.x - start.x, low.z - start.z) <= 0.25 && Math.abs(low.y) <= 0.12, + `V5 malha da rampa ${towerId} não começa no chão`); + ok(Math.hypot(high.x - end.x, high.z - end.z) <= 0.25 && Math.abs(high.y - topY) <= 0.12, + `V5 malha da rampa ${towerId} não alcança a guarita`); + ok((box.max.z - box.min.z) >= 2.4, `V5 rampa ${towerId} estreita para travessia`); + } + + const towerIds = new Set(towers.map((t) => t.userData.vietnamTower)); + for (const ramp of ramps) ok(towerIds.has(ramp.userData.vietnamRamp.towerId), `V6 rampa sem guarita: ${ramp.userData.vietnamRamp.towerId}`); + + ok(world.spawns?.E?.length >= 4 && world.spawns?.B?.length >= 4, 'V7 spawns incompletos'); + ok(world.pickups?.length >= 16, `V8 arsenal curto: ${world.pickups?.length || 0}, esperado >= 16`); + ok(world.waypoints?.nodes?.length >= 80, `V9 navegação pobre: ${world.waypoints?.nodes?.length || 0} nós`); + const a = world.nearestWaypoint(world.spawns.E[0].x, world.spawns.E[0].z); + const b = world.nearestWaypoint(world.spawns.B[0].x, world.spawns.B[0].z); + ok(world.findPath(a, b).length > 2, 'V9 não há rota entre os spawns'); + + const foliageMaterials = new Set(); + world.root.traverse((o) => { + if (!o.isMesh || !o.material?.color) return; + const color = o.material.color.getHex(); + if (color === 0x315b27 || color === 0x4d7835) foliageMaterials.add(o.material); + }); + ok(foliageMaterials.size >= 2, `V12 materiais de folhagem: ${foliageMaterials.size}, esperado >= 2`); + for (const material of foliageMaterials) { + ok(material.isMeshStandardMaterial && material.map?.isCanvasTexture && material.bumpMap?.isCanvasTexture + && material.bumpMap !== material.map && material.bumpMap.colorSpace === THREE.NoColorSpace, + 'V12 folhagem sem textura procedural PBR e relevo'); + ok(material.roughness >= 0.8 && material.metalness === 0, 'V12 resposta física incorreta para folha'); + } + + const stormSky = scene.getObjectByName('ceu-tempestade-vietnan'); + ok(stormSky?.material?.map?.isCanvasTexture && stormSky.material.side === THREE.BackSide, + 'V13 céu de guerra procedural ausente'); + ok(scene.fog?.near <= 48 && scene.fog?.far <= 100 && world.sun?.intensity <= 1.25, + 'V13 atmosfera clara demais para o clima de guerra'); + for (const ramp of ramps) { + const maxChannel = Math.max(ramp.material.color.r, ramp.material.color.g, ramp.material.color.b); + ok(ramp.material.isMeshStandardMaterial && ramp.material.map?.isCanvasTexture + && ramp.material.bumpMap?.isCanvasTexture && ramp.material.roughness >= 0.85 && maxChannel <= 0.55, + `V13 madeira clara ou sem desgaste na ${ramp.name}`); + } + scene.updateMatrixWorld(true); + for (const towerId of ['guarita-oeste', 'guarita-leste']) { + const roof = world.root.getObjectByName(`${towerId}-telhado`); + const columns = [], beams = []; + world.root.traverse((o) => { + if (o.name === `${towerId}-coluna-telhado`) columns.push(o); + if (o.name === `${towerId}-viga-lateral`) beams.push(o); + }); + ok(columns.length === 4, `V14 ${towerId} tem ${columns.length}/4 colunas sustentando o teto`); + ok(beams.length >= 4, `V14 ${towerId} sem travamento lateral completo`); + ok(new Set(columns.map((column) => column.geometry)).size <= 1, + `V14 ${towerId} duplica geometria nas colunas repetidas`); + if (roof) { + const roofBottom = new THREE.Box3().setFromObject(roof).min.y; + for (const column of columns) { + const box = new THREE.Box3().setFromObject(column); + ok(box.min.y <= TOWER_TOP + 0.08 && roofBottom - box.max.y <= 0.12, + `V14 coluna desconectada entre piso e teto em ${towerId}`); + } + } + } + const rampLightness = Math.max(...ramps.map((ramp) => Math.max( + ramp.material.color.r, ramp.material.color.g, ramp.material.color.b))); + ok(world.hemi?.intensity >= 1.1 && world.sun?.intensity >= 1.12 && rampLightness >= 0.3, + 'V15 guaritas escuras demais para leitura durante a partida'); +} + +ok(existsSync(PREVIEW), 'V10 preview public/img/map-previews/treta_vietnan.jpg ausente'); +ok(readFileSync(resolve('src/pages/maps.astro'), 'utf8').includes('treta_vietnan:'), 'V11 tradução da página /maps ausente'); + +console.log(`TRETA NO VIETNÃ${MUTANTE ? ` [mutante: ${MUTANTE}]` : ''}`); +if (falhas.length) { + for (const f of falhas) console.log(` x ${f}`); + process.exit(1); +} +console.log(' ✓ V1–V15 mapa, rampas, guaritas, estrutura, leitura, arsenal, rotas, folhagem, clima, preview e página EN'); From 330b99697fb441753491e3213cac26e53ccc8236 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:17:53 +0000 Subject: [PATCH 02/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 +- package.json | 14 +- scripts/ci/autofix_allowlist.py | 123 + scripts/ci/ensure_labels.py | 44 +- scripts/ci/workflow_security_check.py | 122 +- scripts/fetch-audio.sh | 2 +- scripts/fetch-decals.sh | 2 +- tools/eval/ARCH.md | 4 +- tools/eval/autofix-check.mjs | 141 + tools/eval/deploy-gate-check.mjs | 75 + tools/eval/fixture-check.mjs | 1 - tools/eval/g2ui-map-previews.mjs | 13 +- tools/eval/map_check.json | 4631 +++------------ tools/eval/pickup_check.json | 7694 ++----------------------- tools/eval/portao-inteiro-check.mjs | 68 + tools/eval/telas-menu7.mjs | 4 +- tools/eval/workflow-secret-check.mjs | 74 + 17 files changed, 1992 insertions(+), 11024 deletions(-) create mode 100644 scripts/ci/autofix_allowlist.py create mode 100644 tools/eval/autofix-check.mjs create mode 100644 tools/eval/deploy-gate-check.mjs create mode 100644 tools/eval/portao-inteiro-check.mjs create mode 100644 tools/eval/workflow-secret-check.mjs diff --git a/package-lock.json b/package-lock.json index 07a86a805..e25564558 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index 936e7e48a..29eebdad5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.175", + "version": "2.0.0-alpha.176", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { @@ -119,13 +119,15 @@ "eval:regen": "node tools/eval/regen-check.mjs", "eval:ctfwin": "node tools/eval/ctf-win-check.mjs", "eval:spawn": "node tools/eval/spawn-settle-check.mjs", - "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", - "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:vietnam eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", + "check:deploy": "node tools/eval/runner.mjs syntax eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vmlabhud eval:vminspect eval:redesign eval:charvoice eval:screenquery arch:check docs:check media:check menuwalls:check anims:check anims:merge:check travessao:check eval:medianet eval:posters eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", + "check:fast": "node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam", "eval:tags": "node tools/eval/tag-main-check.mjs", "eval:simclock": "node tools/eval/sim-clock-check.mjs", - "//eval:vietnam": "Treta no Vietnã preserva rampas caminháveis, guaritas estruturadas, arsenal, navegação, iluminação e preview. Mutantes quebram geometria, altura, clima e estrutura.", - "eval:vietnam": "node tools/eval/vietnam-check.mjs", - "eval:mutcega": "node tools/eval/mutacao-cega-check.mjs" + "eval:mutcega": "node tools/eval/mutacao-cega-check.mjs", + "eval:wfsecret": "node tools/eval/workflow-secret-check.mjs", + "eval:deploygate": "node tools/eval/deploy-gate-check.mjs", + "eval:autofix": "node tools/eval/autofix-check.mjs", + "eval:portaointeiro": "node tools/eval/portao-inteiro-check.mjs" }, "repository": { "type": "git", diff --git a/scripts/ci/autofix_allowlist.py b/scripts/ci/autofix_allowlist.py new file mode 100644 index 000000000..812c79212 --- /dev/null +++ b/scripts/ci/autofix_allowlist.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +"""A trava do autofix: decide se o que o bot mexeu pode virar commit. + +O bot só pode tocar em ARQUIVO GERADO — o que uma ferramenta do repositório +reescreve inteiro a partir do código. Se o conserto encostar em qualquer outro +caminho, o run aborta e comenta em vez de commitar. + +A regra não é conveniência: sem ela, o primeiro conserto errado reescreve o mapa +de um colaborador e ninguém repara. Com ela, o pior caso do bot é regenerar uma +doc que já era derivada. + +Uso: git status --porcelain | python3 scripts/ci/autofix_allowlist.py + python3 scripts/ci/autofix_allowlist.py --selftest +""" +import sys + +# Caminhos que uma ferramenta REGERA por inteiro. Crescer esta lista é decisão de +# dono: cada entrada nova é um arquivo que o bot passa a poder sobrescrever sozinho. +PERMITIDOS = ( + "ARCH.generated.md", + "README.md", + "STATUS.md", + "SCRIPTS.md", + "docs/", + "tools/eval/ARCH.md", +) + +# Caminhos que NUNCA entram, mesmo que um prefixo permitido pareça cobri-los. O +# `.github/` fica de fora porque um bot que edita o próprio workflow que o governa +# consegue ampliar a própria permissão em um commit. +PROIBIDOS = ( + ".github/", + "scripts/", + "supabase/", + "package.json", + "package-lock.json", + "vercel.json", +) + + +def permitido(caminho: str) -> bool: + if any(caminho.startswith(p) for p in PROIBIDOS): + return False + return any(caminho == p or caminho.startswith(p) for p in PERMITIDOS) + + +def separa(caminhos: list[str]) -> tuple[list[str], list[str]]: + ok = [c for c in caminhos if permitido(c)] + fora = [c for c in caminhos if not permitido(c)] + return ok, fora + + +def caminhos_do_porcelain(texto: str) -> list[str]: + """`git status --porcelain` -> lista de caminhos. + + Renomeio vem como `R velho -> novo`; o que importa é o destino, senão um + rename para fora da lista passaria como se fosse o arquivo de origem. + """ + saida = [] + for linha in texto.splitlines(): + if len(linha) < 4: + continue + caminho = linha[3:].strip() + if " -> " in caminho: + caminho = caminho.split(" -> ", 1)[1] + saida.append(caminho.strip('"')) + return saida + + +def selftest() -> int: + casos = [ + ("doc gerada passa", ["ARCH.generated.md"], True), + ("pasta docs passa", ["docs/docs/comecando.md"], True), + ("código do jogo NÃO passa", ["public/js/main.js"], False), + ("mapa de colaborador NÃO passa", ["public/js/map_havan.js"], False), + ("workflow NÃO passa", [".github/workflows/ci.yml"], False), + ("script de CI NÃO passa", ["scripts/ci/pr_classify.py"], False), + ("package.json NÃO passa", ["package.json"], False), + ("uma proibida contamina o lote", ["STATUS.md", "public/js/game.js"], False), + ("nada mexido é lote vazio", [], True), + ("CHANGELOG não é gerado por ferramenta nossa", ["CHANGELOG.md"], False), + ("lote típico de release só toca gerado", ["README.md", "STATUS.md", "docs/docs/comecando.md"], True), + ] + erros = 0 + for nome, caminhos, esperado in casos: + _, fora = separa(caminhos) + obtido = not fora + ok = obtido == esperado + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} {nome}: fora={fora!r}") + + porcelain = ' M ARCH.generated.md\nR docs/a.md -> public/js/game.js\n?? novo.txt\n' + lidos = caminhos_do_porcelain(porcelain) + ok = lidos == ["ARCH.generated.md", "public/js/game.js", "novo.txt"] + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} renomeio é julgado pelo DESTINO: {lidos!r}") + + print("selftest verde" if not erros else f"{erros} caso(s) vermelho(s)") + return 0 if not erros else 1 + + +def main() -> int: + if "--selftest" in sys.argv: + return selftest() + # `--caminhos`: a entrada já é uma lista crua (o `git diff --name-only` do merge), + # e não o porcelain. É o modo que o resolvedor de conflito usa. + if "--caminhos" in sys.argv: + caminhos = [l.strip() for l in sys.stdin.read().splitlines() if l.strip()] + else: + caminhos = caminhos_do_porcelain(sys.stdin.read()) + ok, fora = separa(caminhos) + if fora: + print("BLOQUEADO: o conserto encostou em arquivo que o bot não pode reescrever:") + for c in fora: + print(f" - {c}") + return 1 + for c in ok: + print(c) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/ci/ensure_labels.py b/scripts/ci/ensure_labels.py index 6810e02e0..e54053b22 100644 --- a/scripts/ci/ensure_labels.py +++ b/scripts/ci/ensure_labels.py @@ -17,18 +17,50 @@ "crash-auto": ("B60205", "crash de produção reportado por /api/jserror ou prod-watch"), "stale-backlog": ("c2e0c6", "Issue antiga ou desalinhada com o checkout atual; precisa revalidação"), "needs-repro": ("f9d0c4", "Issue precisa passos de reprodução mais concretos"), + "preview-autorizado": ("0e8a16", "Mantenedor revisou o SHA atual e liberou preview do fork na Vercel"), + "pronto-pra-merge": ("0e8a16", "Portões verdes e diff dentro do aceito: falta só o merge, que é humano"), } -def main() -> int: - for label in sys.argv[1:]: +def comandos(nomes: list[str]) -> list[list[str]]: + """Os `gh label create` que ESTE pedido produz. + + Nome fora do dicionário some em silêncio, e foi assim que `preview-autorizado` + passou meses sendo pedida por um workflow sem nunca ser criada — o job de preview + de fork inteiro virou código morto atrás de um rótulo que ninguém podia aplicar. + """ + out = [] + for label in nomes: if label not in LABELS: continue color, description = LABELS[label] - subprocess.run( - ["gh", "label", "create", label, "--color", color, "--description", description, "--force"], - check=True, - ) + out.append(["gh", "label", "create", label, "--color", color, "--description", description, "--force"]) + return out + + +def selftest() -> int: + casos = [ + ("rótulo conhecido vira um comando", ["safe-automerge"], ["safe-automerge"]), + ("desconhecido é ignorado", ["nao-existe"], []), + ("conhecido junto de desconhecido não contamina", ["nao-existe", "bot-fixable"], ["bot-fixable"]), + ("lista vazia não faz nada", [], []), + ("preview-autorizado está registrado", ["preview-autorizado"], ["preview-autorizado"]), + ] + erros = 0 + for nome, pedido, esperado in casos: + obtido = [c[3] for c in comandos(pedido)] + ok = obtido == esperado + erros += 0 if ok else 1 + print(f"{'ok ' if ok else 'FALHA'} {nome}: {obtido!r}") + print("selftest verde" if not erros else f"{erros} caso(s) vermelho(s)") + return 0 if not erros else 1 + + +def main() -> int: + if "--selftest" in sys.argv: + return selftest() + for comando in comandos(sys.argv[1:]): + subprocess.run(comando, check=True) return 0 diff --git a/scripts/ci/workflow_security_check.py b/scripts/ci/workflow_security_check.py index 1740ca9f9..53baec243 100644 --- a/scripts/ci/workflow_security_check.py +++ b/scripts/ci/workflow_security_check.py @@ -9,6 +9,16 @@ def preview_failures(source: str) -> list[str]: + """Contrato do preview de fork POR APROVAÇÃO (desenho antigo). + + Vale enquanto o `preview-bot.yml` tiver o job que publica: ele roda `vercel build`, + isto é, executa o build DO FORK com o token no ambiente, e por isso depende de um + mantenedor revisar o SHA. Quando o preview passou a ser build-sem-segredo + + deploy-sem-código (ver `separacao_failures`), este job deixou de ser necessário — + mas enquanto existir, ele tem de manter TODAS as travas. + """ + if 'vercel deploy' not in source: + return [] # o job de publicação saiu do arquivo: nada a guardar aqui errors = [] required = { 'types: [opened, synchronize, reopened, labeled]': 'evento labeled ausente', @@ -27,13 +37,84 @@ def preview_failures(source: str) -> list[str]: for marker, message in required.items(): if marker not in source: errors.append(message) - if '--add-label "preview-autorizado"' in source: + if '--add-label' in source and 'preview-autorizado' in source: errors.append('workflow autoaprova código de fork') if 'preview_autorizado=true' in source: errors.append('workflow decide autorização sem mantenedor') return errors +def separacao_failures(build: str, deploy: str) -> list[str]: + """Contrato do preview de fork POR SEPARAÇÃO (desenho de 22/08). + + A aprovação manual existia porque UM job fazia as duas coisas: rodava o build do + fork E tinha o token. Separando, os dois lados ficam seguros sozinhos e ninguém + precisa clicar: + + PRV1 quem COMPILA roda código do fork e não recebe segredo — `pull_request` (não + `pull_request_target`), e nenhuma referência a `secrets.` no arquivo; + PRV2 quem PUBLICA roda no contexto base (`workflow_run`), que é o que lhe dá o + segredo mesmo vindo de fork; + PRV4 quem PUBLICA não interpola `${{ }}` dentro de `run:`. A expressão é substituída + no TEXTO do script antes do shell existir, então valor com aspas ou `$(...)` vira + comando — e no caminho de deploy os valores vêm de fora (o número do PR atravessa + um artefato escrito por job que rodou código do fork, a URL é saída de comando). + O CodeQL pegou exatamente isso aqui, como injeção crítica, antes do merge. + PRV3 quem PUBLICA não executa NADA do PR: sem checkout da branch do fork, sem + `npm ci`, sem `npm run`, e o deploy é `--prebuilt` (só envia arquivo). + Furar isto devolve o token para as mãos de quem abriu o PR. + """ + errors = [] + if not build or not deploy: + return ['preview por separação incompleto: falta preview-build.yml ou preview-deploy.yml'] + + # Só a INSTRUÇÃO conta. Os dois arquivos explicam em comentário o que NÃO fazem + # ("não roda npm ci", "não usa pull_request_target") e ler o comentário como se + # fosse código acusaria justamente quem documentou a trava. + def codigo(texto: str) -> str: + return '\n'.join(l for l in texto.splitlines() if not l.lstrip().startswith('#')) + + build, deploy = codigo(build), codigo(deploy) + + if 'pull_request_target' in build: + errors.append('PRV1 o job que COMPILA usa pull_request_target — passaria a enxergar segredo rodando código do fork') + if 'pull_request:' not in build: + errors.append('PRV1 o job que COMPILA não roda em pull_request') + if 'secrets.' in build: + errors.append('PRV1 o job que COMPILA referencia `secrets.` — ele roda código do fork e não pode ter o que roubar') + + if 'workflow_run:' not in deploy: + errors.append('PRV2 o job que PUBLICA não roda em workflow_run — sem contexto base não há segredo em PR de fork') + if 'secrets.VERCEL_TOKEN' not in deploy: + errors.append('PRV2 o job que PUBLICA não usa o token da Vercel') + + # PRV4: `${{ }}` só pode aparecer em `env:`/`with:`/`if:`, nunca dentro do script. + dentro_de_run = False + for linha in deploy.splitlines(): + despido = linha.strip() + if re.match(r'run:\s*\|', despido): + dentro_de_run = True + continue + if dentro_de_run: + # o bloco acaba quando a indentação volta para o nível da chave do passo + if despido and not linha.startswith(' '): + dentro_de_run = False + elif '${{' in linha: + errors.append(f'PRV4 `{despido[:60]}` interpola expressão dentro de run: — passe por env:') + + if '--prebuilt' not in deploy: + errors.append('PRV3 o deploy não é --prebuilt: estaria construindo, e construir é executar código do PR') + for proibido, motivo in ( + ('actions/checkout', 'faz checkout — traria código do PR para o job que tem o token'), + ('npm ci', 'roda npm ci — executaria script do PR'), + ('npm run', 'roda npm run — executaria script do PR'), + ('vercel build', 'roda vercel build — é o build do fork com o token no ambiente'), + ): + if proibido in deploy: + errors.append(f'PRV3 o job que PUBLICA {motivo}') + return errors + + def supply_failures(workflows: dict[Path, str]) -> list[str]: errors = [] for path, source in workflows.items(): @@ -54,7 +135,26 @@ def read_workflows(root: Path = Path('.github/workflows')) -> dict[Path, str]: } +BUILD = Path('.github/workflows/preview-build.yml') +DEPLOY = Path('.github/workflows/preview-deploy.yml') + + +def _ler(p: Path) -> str: + return p.read_text(encoding='utf-8') if p.exists() else '' + + def selftest(source: str) -> list[str]: + build, deploy = _ler(BUILD), _ler(DEPLOY) + separacao = { + 'compila-com-segredo': (build + '\n env:\n X: ${{ secrets.VERCEL_TOKEN }}\n', deploy), + 'compila-com-target': (build.replace(' pull_request:', ' pull_request_target:'), deploy), + 'publica-sem-run': (build, deploy.replace(' workflow_run:', ' schedule:')), + 'publica-faz-checkout': (build, deploy + '\n - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683\n'), + 'publica-constroi': (build, deploy.replace('--prebuilt', '')), + 'publica-interpola': (build, deploy.replace('gh pr comment "$PR_NUM"', 'gh pr comment "${{ steps.pr.outputs.numero }}"')), + } + missed_sep = [n for n, (b, d) in separacao.items() if not separacao_failures(b, d)] + mutations = { 'auto-label': source + '\n# --add-label "preview-autorizado"\n', 'sem-ator': source.replace('repos/$REPO/collaborators/$ACTOR/permission', 'repos/$REPO'), @@ -65,10 +165,22 @@ def selftest(source: str) -> list[str]: 'action-mutável': re.sub(r'actions/checkout@[0-9a-f]{40}', 'actions/checkout@v4', source), 'cli-mutável': re.sub(r'vercel@\d+\.\d+\.\d+', 'vercel@latest', source), } + # As mutações acima descrevem o contrato ANTIGO (preview por aprovação). Quando o + # job que publicava sai do arquivo, elas deixam de ter alvo — testá-las ali seria + # exigir mordida de uma régua que não tem mais o que guardar. O contrato novo é + # medido pelas mutações de `separacao` logo acima. + antigo_vivo = 'vercel deploy' in source missed = [ name for name, mutated in mutations.items() - if not (preview_failures(mutated) + supply_failures({WORKFLOW: mutated})) + if antigo_vivo and not (preview_failures(mutated) + supply_failures({WORKFLOW: mutated})) ] + # Fornecimento (action e CLI presas) vale sempre, e o alvo passou a ser os dois + # arquivos novos: um tem as actions, o outro tem a CLI da Vercel. + fornecimento = { + 'action-mutável': (BUILD, re.sub(r'actions/checkout@[0-9a-f]{40}', 'actions/checkout@v4', build)), + 'cli-mutável': (DEPLOY, re.sub(r'vercel@\d+\.\d+\.\d+', 'vercel@latest', deploy)), + } + missed += [n for n, (alvo, mutado) in fornecimento.items() if not supply_failures({alvo: mutado})] with tempfile.TemporaryDirectory() as tmp: mutant = Path(tmp) / 'mutable-action.yaml' mutant.write_text('steps:\\n - uses: actions/checkout@v4\\n', encoding='utf-8') @@ -83,12 +195,14 @@ def main() -> int: args = parser.parse_args() source = WORKFLOW.read_text(encoding='utf-8') workflows = read_workflows() - errors = preview_failures(source) + supply_failures(workflows) + errors = (preview_failures(source) + + separacao_failures(_ler(BUILD), _ler(DEPLOY)) + + supply_failures(workflows)) if errors: for error in errors: print(f'WFS FAIL: {error}') return 1 - print('WFS PASS: preview de fork exige aprovação manual presa ao SHA') + print('WFS PASS: quem compila código de fork não tem segredo; quem tem segredo não executa código de fork') if args.selftest: missed = selftest(source) if missed: diff --git a/scripts/fetch-audio.sh b/scripts/fetch-audio.sh index 58d27b672..3dd9e6b25 100755 --- a/scripts/fetch-audio.sh +++ b/scripts/fetch-audio.sh @@ -18,7 +18,7 @@ if [ -f "$DEST/manifest.json" ]; then fi mkdir -p "$DEST" echo "Baixando pacote de áudio de: $URL" -curl -fsSL "$URL" -o /tmp/csbrasil-audio.zip +curl --retry 5 --retry-delay 3 --retry-all-errors --connect-timeout 20 -fsSL "$URL" -o /tmp/csbrasil-audio.zip unzip -o -q /tmp/csbrasil-audio.zip -d "$DEST/" [ -f "$DEST/manifest.json" ] || cp "$DEST/manifest.example.json" "$DEST/manifest.json" echo "Pronto. Áudio instalado em $DEST/." diff --git a/scripts/fetch-decals.sh b/scripts/fetch-decals.sh index b9697f17b..dcafbcf85 100755 --- a/scripts/fetch-decals.sh +++ b/scripts/fetch-decals.sh @@ -24,6 +24,6 @@ if [ -d "$DEST" ] && [ "$(ls -1 "$DEST"/*.png 2>/dev/null | grep -cv '/or-')" -g fi mkdir -p "$DEST" echo "Baixando decalques de: $URL" -curl -fsSL "$URL" -o /tmp/csbrasil-decals.zip +curl --retry 5 --retry-delay 3 --retry-all-errors --connect-timeout 20 -fsSL "$URL" -o /tmp/csbrasil-decals.zip unzip -o -q /tmp/csbrasil-decals.zip -d "$DEST/" echo "Pronto. $(ls -1 "$DEST"/*.png | wc -l | tr -d ' ') decalques em $DEST/." diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index 2f0eb067e..e8d932ec1 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,14 +3,14 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.175 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.176 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados | Arquivo | Linhas | Símbolos | |---|---:|---:| | `public/js/game.js` | 6911 | 251 | -| `public/js/main.js` | 2703 | 252 | +| `public/js/main.js` | 2699 | 252 | | `public/js/glbchars.js` | 845 | 60 | | `public/js/characters.js` | 1069 | 40 | | `public/js/vmattach.js` | 629 | 4 | diff --git a/tools/eval/autofix-check.mjs b/tools/eval/autofix-check.mjs new file mode 100644 index 000000000..ec57c4434 --- /dev/null +++ b/tools/eval/autofix-check.mjs @@ -0,0 +1,141 @@ +#!/usr/bin/env node +/* ============================================================================ + autofix-check.mjs — O BOT CONSERTA, MAS SÓ O QUE É DERIVADO + ---------------------------------------------------------------------------- + O autofix é a primeira máquina deste repositório com permissão de ESCREVER num + PR. Isso só é aceitável enquanto três coisas valerem, e esta régua é quem as + segura: + + AF1 · toda escrita passa pela lista de permissão. Um `git commit`/`git push` no + autofix.yml que não seja precedido pela trava é a régua inteira contornada. + AF2 · a lista nunca cobre caminho de código. `public/`, `src/`, `scripts/`, + `.github/` e os manifestos ficam de fora — inclusive `.github/`, porque um + bot que edita o workflow que o governa amplia a própria permissão. + AF3 · o bot não mergeia. Deixar o PR pronto e fechá-lo são coisas diferentes, e + a segunda é humana (decisão do dono, 21/08). + AF4 · e isso vale para o repositório INTEIRO, não só para o autofix: nenhum + workflow pode chamar `gh pr merge`. O `csbrasil-bot-automerge` chamava, e + era a única coisa que um bot daqui fazia sozinho — justamente a que não + devia. Ele agora aplica `pronto-pra-merge` e o botão continua humano. + AF6 · o autofix acorda quando a MAIN anda, não só quando o PR se mexe. Foram 9 + releases em 20 horas e cada um reabre conflito em todo PR aberto; sem o + gatilho de push o bot só conserta quem empurra commit — ou seja, nunca + quem está parado esperando revisão, que é justamente quem precisa. + AF5 · o resolvedor de conflito passa pela MESMA trava e ABORTA quando sobra + conflito fora dela. Resolver conflito de arquivo gerado é mecânico (todo + `chore(release)` reabre um em cada PR aberto); resolver conflito de código + é julgamento. Sem o `git merge --abort` no caminho de exceção, o bot + resolveria código escolhendo um lado no escuro. + + Uso: node tools/eval/autofix-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { + 'autofix-sem-trava': 'AF1', + 'lista-abre-codigo': 'AF2', + 'lista-abre-workflow': 'AF2', + 'autofix-mergeia': 'AF3', + 'automerge-volta': 'AF4', + 'resolve-conflito-de-codigo': 'AF5', + 'sem-varredura-pos-release': 'AF6', +}; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const ler = (p) => { try { return readFileSync(p, 'utf8'); } catch { return ''; } }; +const falhas = []; + +let wf = ler('.github/workflows/autofix.yml'); +let lista = ler('scripts/ci/autofix_allowlist.py'); + +if (MUT === 'autofix-sem-trava') wf = wf.replace(/autofix_allowlist\.py/g, 'cat'); +if (MUT === 'autofix-mergeia') wf = wf.replace('git push origin "HEAD:$HEAD_REF"', 'git push origin "HEAD:$HEAD_REF"\n gh pr merge "$PR_NUMBER" --squash --auto'); +if (MUT === 'lista-abre-codigo') lista = lista.replace(' "docs/",', ' "docs/",\n "public/",'); +if (MUT === 'lista-abre-workflow') lista = lista.replace(/^\s*"\.github\/",$/m, ''); + +if (!wf) { console.log(' \x1b[31m✗\x1b[0m AF0 .github/workflows/autofix.yml não existe'); process.exit(1); } + +/* ---- AF1: escrita só depois da trava ---- */ +const usaTrava = /autofix_allowlist\.py/.test(wf); +const escreve = /git (commit|push)/.test(wf); +const posTrava = wf.indexOf('autofix_allowlist.py'); +const posCommit = wf.search(/git commit/); +if (escreve && (!usaTrava || posCommit < posTrava)) { + falhas.push('AF1 autofix.yml escreve no PR sem passar pela lista de permissão antes'); +} +/* O commit tem de usar SÓ o que a trava liberou, não um `git add -A`. */ +if (/git add\s+(-A|--all|\.)(\s|$)/.test(wf)) { + falhas.push('AF1 autofix.yml usa `git add` abrangente — o commit deve sair da saída da trava'); +} + +/* ---- AF2: a lista não cobre código ---- */ +if (!lista) falhas.push('AF2 scripts/ci/autofix_allowlist.py não existe'); +else { + const bloco = (lista.match(/PERMITIDOS = \(([\s\S]*?)\)/) || [])[1] || ''; + const proibidos = (lista.match(/PROIBIDOS = \(([\s\S]*?)\)/) || [])[1] || ''; + for (const perigoso of ['public/', 'src/', 'supabase/', 'scripts/', '.github/']) { + if (new RegExp(`"${perigoso.replace('.', '\\.')}`).test(bloco)) { + falhas.push(`AF2 a lista de permissão cobre \`${perigoso}\` — o bot passa a poder reescrever código`); + } + } + for (const obrigatorio of ['.github/', 'scripts/', 'package.json']) { + if (!new RegExp(`"${obrigatorio.replace('.', '\\.')}`).test(proibidos)) { + falhas.push(`AF2 \`${obrigatorio}\` não está na lista de proibidos`); + } + } +} + +/* ---- AF3: o bot não mergeia ---- */ +if (/gh pr merge/.test(wf)) { + falhas.push('AF3 autofix.yml mergeia PR — o autofix deixa pronto, quem fecha é gente'); +} + +/* ---- AF5: o resolvedor de conflito aborta quando o conflito é de gente ---- */ +if (MUT === 'resolve-conflito-de-codigo') { + wf = wf.replace(/\s*git merge --abort\n/, '\n'); +} +const resolveConflito = /--caminhos/.test(wf) && /git checkout --theirs/.test(wf); +if (resolveConflito) { + const trecho = wf.slice(wf.indexOf('diff-filter=U'), wf.indexOf('git checkout --theirs')); + if (!/autofix_allowlist\.py --caminhos/.test(trecho)) { + falhas.push('AF5 o resolvedor escolhe lado do conflito sem consultar a lista de permissão'); + } + if (!/git merge --abort/.test(trecho)) { + falhas.push('AF5 o resolvedor não aborta o merge quando sobra conflito fora da lista — passaria a decidir código no escuro'); + } + if (!/--caminhos/.test(ler('scripts/ci/autofix_allowlist.py'))) { + falhas.push('AF5 autofix_allowlist.py não entende `--caminhos`, que é como o resolvedor o consulta'); + } +} + +/* ---- AF6: a varredura pós-release existe e enxerga quem ficou para trás ---- */ +if (MUT === 'sem-varredura-pos-release') wf = wf.replace(/\n push:\n branches: \[main\]/, ''); +const temPush = /^\s{2}push:\n\s{4}branches: \[main\]/m.test(wf); +const temVarredura = /varredura:\n\s+if: github\.event_name == 'push'/.test(wf); +const filtraAtrasado = /mergeable != "MERGEABLE"/.test(wf) && /gh workflow run autofix\.yml/.test(wf); +if (!temPush) falhas.push('AF6 autofix.yml não acorda quando a main anda — PR parado esperando revisão nunca é consertado'); +else if (!temVarredura) falhas.push('AF6 o gatilho de push existe mas não há job de varredura'); +else if (!filtraAtrasado) falhas.push('AF6 a varredura não seleciona os PRs desatualizados nem dispara o autofix de cada um'); + +/* ---- AF4: e nenhum outro workflow mergeia tampouco ---- */ +const WORKFLOWS = readdirSync('.github/workflows').filter((f) => /\.ya?ml$/.test(f)); +for (const nome of WORKFLOWS) { + let texto = ler(`.github/workflows/${nome}`); + if (MUT === 'automerge-volta' && nome === 'csbrasil-bot-automerge.yml') { + texto += "\n subprocess.run(['gh', 'pr', 'merge', pr, '--squash', '--auto'])\n"; + } + /* Só a CHAMADA conta: o comentário que explica por que ela saiu tem de poder citá-la. */ + const linhas = texto.split('\n').filter((l) => !/^\s*#/.test(l)); + if (linhas.some((l) => /gh['"]?,\s*['"]pr['"],\s*['"]merge['"]|gh pr merge/.test(l))) { + falhas.push(`AF4 ${nome} mergeia PR sozinho — deixar pronto e fechar são coisas diferentes`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(' \x1b[32m✓\x1b[0m AF autofix escreve só o que a trava libera, a lista não cobre código e o bot não mergeia'); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/deploy-gate-check.mjs b/tools/eval/deploy-gate-check.mjs new file mode 100644 index 000000000..6b5e5716b --- /dev/null +++ b/tools/eval/deploy-gate-check.mjs @@ -0,0 +1,75 @@ +#!/usr/bin/env node +/* ============================================================================ + deploy-gate-check.mjs — QUEM BLOQUEIA O PR É O CI, NÃO A VERCEL + ---------------------------------------------------------------------------- + MEDIDO EM 21/08/2026: Vercel vermelha em 13 dos 14 PRs vindos de fork, sempre + com `Authorization required to deploy.` - a proteção de fork da própria Vercel, + que não se resolve por commit nenhum. E em 4 PRs de casa o vermelho era build + real, uma vez por `fetch-decals.sh` não ter baixado o acervo (196 de 197 + decalques faltando) num soluço de rede. + + Para poder tirar a Vercel do caminho crítico do PR, duas coisas precisam valer: + + DG1 · o CI constrói o site no próprio PR. Sem isso, tirar a Vercel do bloqueio + deixaria o PR sem NENHUMA prova de que o site compila. + DG2 · nenhum download do caminho do build corre sem retry. `set -e` mais um + `curl` sem `--retry` transforma soluço de rede em PR vermelho, e o autor + não tem o que consertar - é o mesmo dano do portão que não pode medir. + DG3 · o preview de fork roda sem pedir aprovação a ninguém, porque quem compila + não tem segredo e quem tem segredo não compila. Os dois arquivos existem e o + contrato deles é guardado em detalhe pelo `scripts/ci/workflow_security_check.py` + (PRV1/PRV2/PRV3); aqui só se confere que o par não sumiu. + + Uso: node tools/eval/deploy-gate-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'ci-sem-build': 'DG1', 'download-sem-retry': 'DG2', 'preview-sem-par': 'DG3' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const ler = (p) => { try { return readFileSync(p, 'utf8'); } catch { return ''; } }; +const falhas = []; + +/* ---- DG1: o CI constrói no PR ---- */ +let ci = ler('.github/workflows/ci.yml'); +if (MUT === 'ci-sem-build') ci = ci.replace('run: npm run build', 'run: echo pulei o build'); +const on = (ci.match(/^on:\n([\s\S]*?)(?=^\S)/m) || [])[1] || ''; +if (!/^\s{2}pull_request:/m.test(on) || !/run:\s*npm run build/.test(ci)) { + falhas.push('DG1 ci.yml não constrói o site em pull_request — sem isso a Vercel não pode sair do bloqueio'); +} + +/* ---- DG2: download do build com retry ---- */ +const FETCHERS = readdirSync('scripts').filter((f) => /^fetch-.*\.sh$/.test(f)); +for (const f of FETCHERS) { + let sh = ler(`scripts/${f}`); + if (MUT === 'download-sem-retry' && f === 'fetch-decals.sh') { + sh = sh.replace(/curl --retry \d+[^"]*-fsSL/, 'curl -fsSL'); + } + for (const linha of sh.split('\n')) { + if (!/^\s*curl\s/.test(linha)) continue; + if (!/--retry\b/.test(linha)) { + falhas.push(`DG2 scripts/${f}: curl sem --retry no caminho do build — soluço de rede vira PR vermelho`); + } + } +} +if (!FETCHERS.length) falhas.push('DG2 nenhum scripts/fetch-*.sh encontrado — a régua perdeu o alvo'); + +/* ---- DG3: a etiqueta do preview nasce com quem a usa ---- */ +let preview = ler('.github/workflows/preview-bot.yml'); +if (MUT === 'preview-sem-par') preview = preview.replace(/ensure_labels\.py preview-autorizado/, 'ensure_labels.py'); +const temBuild = ler('.github/workflows/preview-build.yml'); +const temDeploy = ler('.github/workflows/preview-deploy.yml'); +if (MUT === 'preview-sem-par') { /* nome antigo do mutante: agora derruba o par */ } +const par = (MUT === 'preview-sem-par') ? '' : (temBuild && temDeploy); +if (!par) { + falhas.push('DG3 falta preview-build.yml ou preview-deploy.yml — sem o par, preview de fork volta a depender de aprovação humana'); +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(` \x1b[32m✓\x1b[0m DG o PR é bloqueado pelo build do CI; download tem retry (${FETCHERS.length} fetchers); preview de fork sem aprovação`); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/fixture-check.mjs b/tools/eval/fixture-check.mjs index 987f43be2..a10fd1b42 100644 --- a/tools/eval/fixture-check.mjs +++ b/tools/eval/fixture-check.mjs @@ -35,7 +35,6 @@ const base = arg('base') || 'origin/main'; /* Dívida herdada: script de decisão que nasceu sem fixture. A lista só encolhe. Quem tocar num destes escreve o `--selftest` no mesmo PR. */ const SEM_FIXTURE = new Set([ - 'scripts/ci/ensure_labels.py', 'scripts/ci/issue_triage.py', 'scripts/ci/pr_classify.py', 'scripts/ci/pr_route.py', diff --git a/tools/eval/g2ui-map-previews.mjs b/tools/eval/g2ui-map-previews.mjs index 6f265a57e..6c9a0fa51 100644 --- a/tools/eval/g2ui-map-previews.mjs +++ b/tools/eval/g2ui-map-previews.mjs @@ -52,8 +52,6 @@ const POSES = process.env.POSES ? JSON.parse(process.env.POSES) : { velho_oeste: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, penitenciaria: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, parque_treta: { pos: [0, 30, -35], pitch: -0.55, yaw: 3.14 }, - // Vilarejo central enquadrado entre as duas guaritas, com mata e ponte em profundidade. - treta_vietnan: { pos: [0, 8.5, 26], pitch: -0.26, yaw: -0.4 }, }; const NOPOSE = process.env.NOPOSE === '1'; // captura do spawn, sem pino de posição const TAG = process.env.TAG || ''; @@ -75,9 +73,7 @@ if (process.argv[2] === '--write') { const LIST = (process.argv[2] || 'praca_poderes,piscina_treta,loja_h,ferro_velho,quebrada').split(','); const YAWS = (process.argv[3] || '-2.4,-1.8,-1.2,-0.6,0,0.6,1.2,1.8,2.4,3.0').split(',').map(Number); const gRoot = execSync('npm root -g').toString().trim(); -let _pw; -try { _pw = await import('playwright'); } -catch { _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); } +const _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); const chromium = _pw.chromium || _pw.default?.chromium; mkdirSync(OUT, { recursive: true }); @@ -100,7 +96,7 @@ page.on('pageerror', e => { errors++; console.error('[pageerror]', e.message); } for (const mapId of LIST) { await page.goto(`${BASE}/?debug=1&auto=P,mst&map=${mapId}`, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForFunction(() => window.__game && window.__game.state === 'live', null, { timeout: 180000 }); - await page.addStyleTag({ content: '#hud,astro-dev-toolbar{display:none!important}' }); + await page.addStyleTag({ content: '#hud{display:none!important}' }); await page.evaluate((pose) => { const g = window.__game; g.player.hp = 1e9; @@ -129,11 +125,6 @@ for (const mapId of LIST) { if (gg.vmScene) gg.vmScene.visible = false; for (const b of gg.bots || []) if (b.mesh?.group) mute(b.mesh.group); if (gg.drops) for (const d of gg.drops) if (d.mesh) mute(d.mesh); - if (window.__pin.pos && gg.camera && gg.renderer) { - gg.camera.position.set(window.__pin.pos[0], window.__pin.pos[1] + 1.62, window.__pin.pos[2]); - gg.camera.rotation.set(window.__pin.pitch, window.__pin.yaw, 0); - gg.renderer.render(gg.scene, gg.camera); - } } requestAnimationFrame(tick); }; diff --git a/tools/eval/map_check.json b/tools/eval/map_check.json index e5ff7ccaa..d3441737b 100644 --- a/tools/eval/map_check.json +++ b/tools/eval/map_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-19T01:42:54.928Z", + "gerado": "2026-08-15T02:08:00.345Z", "criterios": { "map1": "corpo dentro de sólido: raycast do peito (1.4 m) até o chão; sólido com topo > 0.3 m acima do chão local reprova", "map2": "exposição: fração dos pontos andáveis a ≥ 25 m com _losClear até a cabeça (1.62 m) de quem nasce", @@ -5284,7 +5284,7 @@ "occluderSemMalha": [], "occMedidos": 411, "occPulados": 0, - "fracSemMalha": 0.0037, + "fracSemMalha": 0.0036, "quadrantes": [ { "q": "0,0", @@ -6203,3752 +6203,584 @@ "alturaTrianguloMin": 14 }, { - "map": "upa_24h", - "celulasAlcancadas": 54212, - "amostrasChao": 3371, - "observadores": 862, - "corpoDentroDeSolido": 0, + "map": "obras_prefeitura", + "celulasAlcancadas": 54416, + "amostrasChao": 3384, + "observadores": 846, + "corpoDentroDeSolido": 8, "submersosAcimaDoPeito": 0, - "piorPenetracao": 0, - "piores": [], - "dentroTodos": [], + "piorPenetracao": 1.31, + "piores": [ + { + "tipo": "chao", + "x": 9.5, + "z": 0.5, + "pen": 1.31 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 2.5, + "pen": 1.253 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 4.5, + "pen": 1.205 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 3.5, + "pen": 1.198 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 1.5, + "pen": 1.033 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 2.5, + "pen": 0.796 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 3.5, + "pen": 0.661 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 4.5, + "pen": 0.651 + } + ], + "dentroTodos": [ + { + "tipo": "chao", + "x": 9.5, + "z": 0.5, + "pen": 1.31 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 2.5, + "pen": 1.253 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 4.5, + "pen": 1.205 + }, + { + "tipo": "chao", + "x": 8.5, + "z": 3.5, + "pen": 1.198 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 1.5, + "pen": 1.033 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 2.5, + "pen": 0.796 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 3.5, + "pen": 0.661 + }, + { + "tipo": "chao", + "x": 9.5, + "z": 4.5, + "pen": 0.651 + } + ], "spawns": [ { "team": "E", - "x": -25, + "x": 4, "z": -31, - "chao": 0, + "chao": 0.02, "penetracao": 0 }, { "team": "E", - "x": -20, + "x": -2, "z": -31, - "chao": 0, + "chao": -0.01, "penetracao": 0 }, { "team": "E", - "x": -15, + "x": 10, "z": -31, - "chao": 0, + "chao": 0.03, "penetracao": 0 }, { "team": "E", - "x": -10, + "x": -8, "z": -31, - "chao": 0, + "chao": -0.02, "penetracao": 0 }, { "team": "B", - "x": 10, + "x": 4, "z": 31, - "chao": 0, + "chao": 0.01, "penetracao": 0 }, { "team": "B", - "x": 15, + "x": -2, "z": 31, - "chao": 0, + "chao": -0.02, "penetracao": 0 }, { "team": "B", - "x": 20, + "x": 10, "z": 31, - "chao": 0, + "chao": 0.02, "penetracao": 0 }, { "team": "B", - "x": 25, + "x": -8, "z": 31, - "chao": 0, + "chao": -0.03, "penetracao": 0 } ], "exposicaoPorTime": [ { "team": "E", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.1557, - "maiorVisada": 64.3 + "chaoMin": -0.02, + "chaoMax": 0.03, + "fracMedia": 0.8852, + "maiorVisada": 73.6 }, { "team": "B", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.0271, - "maiorVisada": 64.3 + "chaoMin": -0.03, + "chaoMax": 0.02, + "fracMedia": 0.8905, + "maiorVisada": 72.7 } ], "exposicaoPorSpawn": [ { "team": "E", - "x": -25, + "x": 4, "z": -31, - "chao": 0, - "obsLonge": 713, - "obsVendo": 134, - "frac": 0.1879, - "maiorVisada": 64.3 + "chao": 0.02, + "obsLonge": 599, + "obsVendo": 515, + "frac": 0.8598, + "maiorVisada": 70.9 }, { "team": "E", - "x": -20, + "x": -2, "z": -31, - "chao": 0, - "obsLonge": 686, - "obsVendo": 122, - "frac": 0.1778, - "maiorVisada": 64.2 + "chao": -0.01, + "obsLonge": 593, + "obsVendo": 527, + "frac": 0.8887, + "maiorVisada": 69 }, { "team": "E", - "x": -15, + "x": 10, "z": -31, - "chao": 0, - "obsLonge": 656, - "obsVendo": 88, - "frac": 0.1341, - "maiorVisada": 44.9 + "chao": 0.03, + "obsLonge": 622, + "obsVendo": 561, + "frac": 0.9019, + "maiorVisada": 73.6 }, { "team": "E", - "x": -10, + "x": -8, "z": -31, - "chao": 0, - "obsLonge": 633, - "obsVendo": 78, - "frac": 0.1232, - "maiorVisada": 40.3 + "chao": -0.02, + "obsLonge": 603, + "obsVendo": 537, + "frac": 0.8905, + "maiorVisada": 73.1 }, { "team": "B", - "x": 10, + "x": 4, "z": 31, - "chao": 0, - "obsLonge": 643, - "obsVendo": 3, - "frac": 0.0047, - "maiorVisada": 29.4 + "chao": 0.01, + "obsLonge": 585, + "obsVendo": 524, + "frac": 0.8957, + "maiorVisada": 69.2 }, { "team": "B", - "x": 15, + "x": -2, "z": 31, - "chao": 0, - "obsLonge": 668, - "obsVendo": 16, - "frac": 0.024, - "maiorVisada": 44.9 + "chao": -0.02, + "obsLonge": 582, + "obsVendo": 503, + "frac": 0.8643, + "maiorVisada": 68.1 }, { "team": "B", - "x": 20, + "x": 10, "z": 31, - "chao": 0, - "obsLonge": 696, - "obsVendo": 35, - "frac": 0.0503, - "maiorVisada": 64.2 + "chao": 0.02, + "obsLonge": 606, + "obsVendo": 542, + "frac": 0.8944, + "maiorVisada": 72.7 }, { "team": "B", - "x": 25, + "x": -8, "z": 31, - "chao": 0, - "obsLonge": 719, - "obsVendo": 21, - "frac": 0.0292, - "maiorVisada": 64.3 + "chao": -0.03, + "obsLonge": 596, + "obsVendo": 541, + "frac": 0.9077, + "maiorVisada": 72.3 } ], "salaDoSpawn": [ { "team": "E", - "x": -25, + "x": 4, "z": -31, - "folgaParede": 3.35, - "dirPior": 214, - "areaContigua": 64, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "E", - "x": -20, + "x": -2, "z": -31, - "folgaParede": 4.5, + "folgaParede": 3.45, "dirPior": 264, - "areaContigua": 72.1, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "E", - "x": -15, + "x": 10, "z": -31, - "folgaParede": 4.5, + "folgaParede": 3.45, "dirPior": 264, - "areaContigua": 72.1, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "E", - "x": -10, + "x": -8, "z": -31, - "folgaParede": 4.3, - "dirPior": 332, - "areaContigua": 69.8, + "folgaParede": 3.45, + "dirPior": 264, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": 10, + "x": 4, "z": 31, - "folgaParede": 4.2, - "dirPior": 242, - "areaContigua": 69.2, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": 15, + "x": -2, "z": 31, - "folgaParede": 4.5, + "folgaParede": 3.45, "dirPior": 84, - "areaContigua": 72.1, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": 20, + "x": 10, "z": 31, - "folgaParede": 4.5, + "folgaParede": 3.45, "dirPior": 84, - "areaContigua": 71.8, + "areaContigua": 68.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": 25, + "x": -8, "z": 31, - "folgaParede": 3.35, - "dirPior": 34, - "areaContigua": 64, + "folgaParede": 3.45, + "dirPior": 84, + "areaContigua": 68.3, "okFolga": true, "okArea": true } ], - "piorFolga": 3.35, - "piorArea": 64, + "piorFolga": 3.45, + "piorArea": 68.3, "escadas": [], "travessia": [], "occluderSemMalha": [], - "occMedidos": 122, + "occMedidos": 32, "occPulados": 0, - "fracSemMalha": 0.0041, + "fracSemMalha": 0, "quadrantes": [ { "q": "0,0", - "x0": -29, - "z0": -35, - "areaAndavel": 215, - "props": 5, - "waypoints": 25, - "densProp": 2.33, - "densWp": 11.63, - "espacamento": 6.56, - "razaoProp": 0.73, - "razaoWp": 0.98 - }, - { - "q": "0,1", - "x0": -29, - "z0": -17.5, - "areaAndavel": 203, - "props": 10, - "waypoints": 24, - "densProp": 4.92, - "densWp": 11.8, - "espacamento": 4.51, - "razaoProp": 1.55, - "razaoWp": 0.99 - }, - { - "q": "0,2", - "x0": -29, - "z0": 0, - "areaAndavel": 211, - "props": 8, - "waypoints": 24, - "densProp": 3.79, - "densWp": 11.38, - "espacamento": 5.13, - "razaoProp": 1.19, - "razaoWp": 0.96 - }, - { - "q": "0,3", - "x0": -29, - "z0": 17.5, - "areaAndavel": 214, - "props": 12, - "waypoints": 25, - "densProp": 5.62, - "densWp": 11.71, - "espacamento": 4.22, - "razaoProp": 1.77, - "razaoWp": 0.98 - }, - { - "q": "1,0", - "x0": -14.5, - "z0": -35, - "areaAndavel": 224, - "props": 3, - "waypoints": 28, - "densProp": 1.34, - "densWp": 12.51, - "espacamento": 8.64, - "razaoProp": 0.42, - "razaoWp": 1.05 - }, - { - "q": "1,1", - "x0": -14.5, - "z0": -17.5, - "areaAndavel": 205, - "props": 6, - "waypoints": 25, - "densProp": 2.93, - "densWp": 12.21, - "espacamento": 5.84, - "razaoProp": 0.92, - "razaoWp": 1.03 - }, - { - "q": "1,2", - "x0": -14.5, - "z0": 0, - "areaAndavel": 204, - "props": 7, - "waypoints": 25, - "densProp": 3.43, - "densWp": 12.26, - "espacamento": 5.4, - "razaoProp": 1.08, - "razaoWp": 1.03 - }, - { - "q": "1,3", - "x0": -14.5, - "z0": 17.5, - "areaAndavel": 208, - "props": 12, - "waypoints": 25, - "densProp": 5.76, - "densWp": 12, - "espacamento": 4.17, - "razaoProp": 1.81, - "razaoWp": 1.01 - }, - { - "q": "2,0", - "x0": 0, - "z0": -35, - "areaAndavel": 218, - "props": 4, - "waypoints": 33, - "densProp": 1.84, - "densWp": 15.15, - "espacamento": 7.38, - "razaoProp": 0.58, - "razaoWp": 1.27 - }, - { - "q": "2,1", - "x0": 0, - "z0": -17.5, - "areaAndavel": 198, - "props": 8, - "waypoints": 29, - "densProp": 4.03, - "densWp": 14.62, - "espacamento": 4.98, - "razaoProp": 1.27, - "razaoWp": 1.23 - }, - { - "q": "2,2", - "x0": 0, - "z0": 0, - "areaAndavel": 206, - "props": 5, - "waypoints": 28, - "densProp": 2.42, - "densWp": 13.58, - "espacamento": 6.42, - "razaoProp": 0.76, - "razaoWp": 1.14 - }, - { - "q": "2,3", - "x0": 0, - "z0": 17.5, - "areaAndavel": 212, - "props": 12, - "waypoints": 30, - "densProp": 5.66, - "densWp": 14.14, - "espacamento": 4.21, - "razaoProp": 1.78, - "razaoWp": 1.19 - }, - { - "q": "3,0", - "x0": 14.5, - "z0": -35, - "areaAndavel": 220, - "props": 5, - "waypoints": 21, - "densProp": 2.27, - "densWp": 9.53, - "espacamento": 6.64, - "razaoProp": 0.71, - "razaoWp": 0.8 - }, - { - "q": "3,1", - "x0": 14.5, - "z0": -17.5, - "areaAndavel": 216, - "props": 6, - "waypoints": 21, - "densProp": 2.77, - "densWp": 9.71, - "espacamento": 6, - "razaoProp": 0.87, - "razaoWp": 0.82 - }, - { - "q": "3,2", - "x0": 14.5, - "z0": 0, - "areaAndavel": 208, - "props": 6, - "waypoints": 18, - "densProp": 2.89, - "densWp": 8.67, - "espacamento": 5.88, - "razaoProp": 0.91, - "razaoWp": 0.73 - }, - { - "q": "3,3", - "x0": 14.5, - "z0": 17.5, - "areaAndavel": 226, - "props": 9, - "waypoints": 23, - "densProp": 3.99, - "densWp": 10.19, - "espacamento": 5.01, - "razaoProp": 1.25, - "razaoWp": 0.86 - } - ], - "medianaProp": 3.18, - "medianaWp": 11.9, - "piorRazaoProp": 0.42, - "piorRazaoWp": 0.73, - "piorEspacamento": 8.64, - "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 9.6, - 9.6, - 9.6, - 9.6 - ] - }, - { - "time": "E", - "bandeira": "MID", - "rotas": 2, - "comprimentos": [ - 41, - 55.2 - ] - }, - { - "time": "E", - "bandeira": "B", - "rotas": 2, - "comprimentos": [ - 90.7, - 98.9 - ] - }, - { - "time": "B", - "bandeira": "E", - "rotas": 2, - "comprimentos": [ - 77, - 99.1 - ] - }, - { - "time": "B", - "bandeira": "MID", - "rotas": 2, - "comprimentos": [ - 45.5, - 66.9 - ] - }, - { - "time": "B", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 6.8, - 6.8, - 6.8, - 6.8 - ] - } - ], - "piorRotas": 2, - "bandeiras": [ - { - "id": "E", - "label": "RECEPÇÃO", - "x": -18, - "z": -28, - "distSpawn": 3.61, - "timeSpawn": "E", - "maiorLinhaTiro": 45.9, - "chao": 0, - "penetracao": 0 - }, - { - "id": "MID", - "label": "CORREDOR", - "x": 0, - "z": -8, - "distSpawn": 25.08, - "timeSpawn": "E", - "maiorLinhaTiro": 41, - "chao": 0, - "penetracao": 0 - }, - { - "id": "B", - "label": "EMERGÊNCIA", - "x": 18, - "z": 28, - "distSpawn": 3.61, - "timeSpawn": "B", - "maiorLinhaTiro": 41.6, - "chao": 0, - "penetracao": 0 - } - ], - "alturaTrianguloMin": 4.33 - }, - { - "map": "obras_prefeitura", - "celulasAlcancadas": 54416, - "amostrasChao": 3384, - "observadores": 846, - "corpoDentroDeSolido": 8, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 1.31, - "piores": [ - { - "tipo": "chao", - "x": 9.5, - "z": 0.5, - "pen": 1.31 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 2.5, - "pen": 1.253 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 4.5, - "pen": 1.205 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 3.5, - "pen": 1.198 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 1.5, - "pen": 1.033 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 2.5, - "pen": 0.796 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 3.5, - "pen": 0.661 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 4.5, - "pen": 0.651 - } - ], - "dentroTodos": [ - { - "tipo": "chao", - "x": 9.5, - "z": 0.5, - "pen": 1.31 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 2.5, - "pen": 1.253 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 4.5, - "pen": 1.205 - }, - { - "tipo": "chao", - "x": 8.5, - "z": 3.5, - "pen": 1.198 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 1.5, - "pen": 1.033 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 2.5, - "pen": 0.796 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 3.5, - "pen": 0.661 - }, - { - "tipo": "chao", - "x": 9.5, - "z": 4.5, - "pen": 0.651 - } - ], - "spawns": [ - { - "team": "E", - "x": 4, - "z": -31, - "chao": 0.02, - "penetracao": 0 - }, - { - "team": "E", - "x": -2, - "z": -31, - "chao": -0.01, - "penetracao": 0 - }, - { - "team": "E", - "x": 10, - "z": -31, - "chao": 0.03, - "penetracao": 0 - }, - { - "team": "E", - "x": -8, - "z": -31, - "chao": -0.02, - "penetracao": 0 - }, - { - "team": "B", - "x": 4, - "z": 31, - "chao": 0.01, - "penetracao": 0 - }, - { - "team": "B", - "x": -2, - "z": 31, - "chao": -0.02, - "penetracao": 0 - }, - { - "team": "B", - "x": 10, - "z": 31, - "chao": 0.02, - "penetracao": 0 - }, - { - "team": "B", - "x": -8, - "z": 31, - "chao": -0.03, - "penetracao": 0 - } - ], - "exposicaoPorTime": [ - { - "team": "E", - "chaoMin": -0.02, - "chaoMax": 0.03, - "fracMedia": 0.8852, - "maiorVisada": 73.6 - }, - { - "team": "B", - "chaoMin": -0.03, - "chaoMax": 0.02, - "fracMedia": 0.8905, - "maiorVisada": 72.7 - } - ], - "exposicaoPorSpawn": [ - { - "team": "E", - "x": 4, - "z": -31, - "chao": 0.02, - "obsLonge": 599, - "obsVendo": 515, - "frac": 0.8598, - "maiorVisada": 70.9 - }, - { - "team": "E", - "x": -2, - "z": -31, - "chao": -0.01, - "obsLonge": 593, - "obsVendo": 527, - "frac": 0.8887, - "maiorVisada": 69 - }, - { - "team": "E", - "x": 10, - "z": -31, - "chao": 0.03, - "obsLonge": 622, - "obsVendo": 561, - "frac": 0.9019, - "maiorVisada": 73.6 - }, - { - "team": "E", - "x": -8, - "z": -31, - "chao": -0.02, - "obsLonge": 603, - "obsVendo": 537, - "frac": 0.8905, - "maiorVisada": 73.1 - }, - { - "team": "B", - "x": 4, - "z": 31, - "chao": 0.01, - "obsLonge": 585, - "obsVendo": 524, - "frac": 0.8957, - "maiorVisada": 69.2 - }, - { - "team": "B", - "x": -2, - "z": 31, - "chao": -0.02, - "obsLonge": 582, - "obsVendo": 503, - "frac": 0.8643, - "maiorVisada": 68.1 - }, - { - "team": "B", - "x": 10, - "z": 31, - "chao": 0.02, - "obsLonge": 606, - "obsVendo": 542, - "frac": 0.8944, - "maiorVisada": 72.7 - }, - { - "team": "B", - "x": -8, - "z": 31, - "chao": -0.03, - "obsLonge": 596, - "obsVendo": 541, - "frac": 0.9077, - "maiorVisada": 72.3 - } - ], - "salaDoSpawn": [ - { - "team": "E", - "x": 4, - "z": -31, - "folgaParede": 3.45, - "dirPior": 264, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -2, - "z": -31, - "folgaParede": 3.45, - "dirPior": 264, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 10, - "z": -31, - "folgaParede": 3.45, - "dirPior": 264, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -8, - "z": -31, - "folgaParede": 3.45, - "dirPior": 264, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 4, - "z": 31, - "folgaParede": 3.45, - "dirPior": 84, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -2, - "z": 31, - "folgaParede": 3.45, - "dirPior": 84, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 10, - "z": 31, - "folgaParede": 3.45, - "dirPior": 84, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -8, - "z": 31, - "folgaParede": 3.45, - "dirPior": 84, - "areaContigua": 68.3, - "okFolga": true, - "okArea": true - } - ], - "piorFolga": 3.45, - "piorArea": 68.3, - "escadas": [], - "travessia": [], - "occluderSemMalha": [], - "occMedidos": 32, - "occPulados": 0, - "fracSemMalha": 0, - "quadrantes": [ - { - "q": "0,0", - "x0": -27.5, - "z0": -34.5, - "areaAndavel": 222, - "props": 0, - "waypoints": 20, - "densProp": 0, - "densWp": 9.01, - "espacamento": 99, - "razaoProp": 0, - "razaoWp": 1 - }, - { - "q": "0,1", - "x0": -27.5, - "z0": -17.3, - "areaAndavel": 212, - "props": 7, - "waypoints": 23, - "densProp": 3.3, - "densWp": 10.84, - "espacamento": 5.51, - "razaoProp": 2.4, - "razaoWp": 1.2 - }, - { - "q": "0,2", - "x0": -27.5, - "z0": 0, - "areaAndavel": 215, - "props": 8, - "waypoints": 20, - "densProp": 3.72, - "densWp": 9.29, - "espacamento": 5.19, - "razaoProp": 2.71, - "razaoWp": 1.03 - }, - { - "q": "0,3", - "x0": -27.5, - "z0": 17.3, - "areaAndavel": 202, - "props": 2, - "waypoints": 19, - "densProp": 0.99, - "densWp": 9.39, - "espacamento": 10.06, - "razaoProp": 0.72, - "razaoWp": 1.04 - }, - { - "q": "1,0", - "x0": -13.8, - "z0": -34.5, - "areaAndavel": 225, - "props": 1, - "waypoints": 25, - "densProp": 0.44, - "densWp": 11.12, - "espacamento": 15, - "razaoProp": 0.32, - "razaoWp": 1.23 - }, - { - "q": "1,1", - "x0": -13.8, - "z0": -17.3, - "areaAndavel": 208, - "props": 3, - "waypoints": 22, - "densProp": 1.45, - "densWp": 10.6, - "espacamento": 8.32, - "razaoProp": 1.05, - "razaoWp": 1.18 - }, - { - "q": "1,2", - "x0": -13.8, - "z0": 0, - "areaAndavel": 208, - "props": 3, - "waypoints": 18, - "densProp": 1.45, - "densWp": 8.67, - "espacamento": 8.32, - "razaoProp": 1.05, - "razaoWp": 0.96 - }, - { - "q": "1,3", - "x0": -13.8, - "z0": 17.3, - "areaAndavel": 228, - "props": 2, - "waypoints": 24, - "densProp": 0.88, - "densWp": 10.55, - "espacamento": 10.67, - "razaoProp": 0.64, - "razaoWp": 1.17 - }, - { - "q": "2,0", - "x0": 0, - "z0": -34.5, - "areaAndavel": 225, - "props": 3, - "waypoints": 20, - "densProp": 1.33, - "densWp": 8.89, - "espacamento": 8.66, - "razaoProp": 0.97, - "razaoWp": 0.99 - }, - { - "q": "2,1", - "x0": 0, - "z0": -17.3, - "areaAndavel": 211, - "props": 3, - "waypoints": 19, - "densProp": 1.42, - "densWp": 9.02, - "espacamento": 8.38, - "razaoProp": 1.03, - "razaoWp": 1 - }, - { - "q": "2,2", - "x0": 0, - "z0": 0, - "areaAndavel": 212, - "props": 3, - "waypoints": 16, - "densProp": 1.42, - "densWp": 7.56, - "espacamento": 8.4, - "razaoProp": 1.03, - "razaoWp": 0.84 - }, - { - "q": "2,3", - "x0": 0, - "z0": 17.3, - "areaAndavel": 228, - "props": 1, - "waypoints": 17, - "densProp": 0.44, - "densWp": 7.45, - "espacamento": 15.1, - "razaoProp": 0.32, - "razaoWp": 0.83 - }, - { - "q": "3,0", - "x0": 13.8, - "z0": -34.5, - "areaAndavel": 192, - "props": 2, - "waypoints": 17, - "densProp": 1.04, - "densWp": 8.85, - "espacamento": 9.8, - "razaoProp": 0.76, - "razaoWp": 0.98 - }, - { - "q": "3,1", - "x0": 13.8, - "z0": -17.3, - "areaAndavel": 204, - "props": 4, - "waypoints": 20, - "densProp": 1.96, - "densWp": 9.8, - "espacamento": 7.14, - "razaoProp": 1.43, - "razaoWp": 1.09 - }, - { - "q": "3,2", - "x0": 13.8, - "z0": 0, - "areaAndavel": 201, - "props": 9, - "waypoints": 17, - "densProp": 4.47, - "densWp": 8.44, - "espacamento": 4.73, - "razaoProp": 3.25, - "razaoWp": 0.94 - }, - { - "q": "3,3", - "x0": 13.8, - "z0": 17.3, - "areaAndavel": 209, - "props": 2, - "waypoints": 17, - "densProp": 0.96, - "densWp": 8.15, - "espacamento": 10.21, - "razaoProp": 0.7, - "razaoWp": 0.9 - } - ], - "medianaProp": 1.375, - "medianaWp": 9.015, - "piorRazaoProp": 0, - "piorRazaoWp": 0.83, - "piorEspacamento": 99, - "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 28.3, - 33.6, - 41.8, - 46.4 - ] - }, - { - "time": "E", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 31.5, - 41.3, - 56.7, - 64.2 - ] - }, - { - "time": "E", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 48.8, - 57.8, - 58.6, - 73.3 - ] - }, - { - "time": "B", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 46.9, - 49.6, - 58.6, - 65.8 - ] - }, - { - "time": "B", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 34.7, - 41.8, - 44.5, - 61.8 - ] - }, - { - "time": "B", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 20, - 20, - 20, - 20 - ] - } - ], - "piorRotas": 4, - "bandeiras": [ - { - "id": "E", - "label": "CANTEIRO SUL", - "x": -10, - "z": -14, - "distSpawn": 17.12, - "timeSpawn": "E", - "maiorLinhaTiro": 59.9, - "chao": -1.58, - "penetracao": 1.017 - }, - { - "id": "MID", - "label": "A OBRA", - "x": 9, - "z": 0, - "distSpawn": 31.02, - "timeSpawn": "E", - "maiorLinhaTiro": 48.1, - "chao": 0.1, - "penetracao": 0 - }, - { - "id": "B", - "label": "CANTEIRO NORTE", - "x": -10, - "z": 14, - "distSpawn": 17.12, - "timeSpawn": "B", - "maiorLinhaTiro": 59.1, - "chao": -0.79, - "penetracao": 0 - } - ], - "alturaTrianguloMin": 19 - }, - { - "map": "atacadao_treta", - "celulasAlcancadas": 46509, - "amostrasChao": 3028, - "observadores": 767, - "corpoDentroDeSolido": 0, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 0, - "piores": [], - "dentroTodos": [], - "spawns": [ - { - "team": "E", - "x": 6, - "z": -37, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "E", - "x": 14, - "z": -37, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "E", - "x": -6, - "z": -37, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "E", - "x": -14, - "z": -37, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "B", - "x": -8, - "z": 29, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -2, - "z": 29, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 4, - "z": 29, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 10, - "z": 29, - "chao": 0, - "penetracao": 0 - } - ], - "exposicaoPorTime": [ - { - "team": "E", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.4588, - "maiorVisada": 70.5 - }, - { - "team": "B", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.078, - "maiorVisada": 68.5 - } - ], - "exposicaoPorSpawn": [ - { - "team": "E", - "x": 6, - "z": -37, - "chao": 0, - "obsLonge": 560, - "obsVendo": 253, - "frac": 0.4518, - "maiorVisada": 70.5 - }, - { - "team": "E", - "x": 14, - "z": -37, - "chao": 0, - "obsLonge": 594, - "obsVendo": 269, - "frac": 0.4529, - "maiorVisada": 68.2 - }, - { - "team": "E", - "x": -6, - "z": -37, - "chao": 0, - "obsLonge": 565, - "obsVendo": 263, - "frac": 0.4655, - "maiorVisada": 70.2 - }, - { - "team": "E", - "x": -14, - "z": -37, - "chao": 0, - "obsLonge": 600, - "obsVendo": 279, - "frac": 0.465, - "maiorVisada": 68.1 - }, - { - "team": "B", - "x": -8, - "z": 29, - "chao": 0, - "obsLonge": 547, - "obsVendo": 9, - "frac": 0.0165, - "maiorVisada": 32.6 - }, - { - "team": "B", - "x": -2, - "z": 29, - "chao": 0, - "obsLonge": 526, - "obsVendo": 64, - "frac": 0.1217, - "maiorVisada": 68.5 - }, - { - "team": "B", - "x": 4, - "z": 29, - "chao": 0, - "obsLonge": 528, - "obsVendo": 11, - "frac": 0.0208, - "maiorVisada": 31.8 - }, - { - "team": "B", - "x": 10, - "z": 29, - "chao": 0, - "obsLonge": 556, - "obsVendo": 85, - "frac": 0.1529, - "maiorVisada": 68.5 - } - ], - "salaDoSpawn": [ - { - "team": "E", - "x": 6, - "z": -37, - "folgaParede": 4.45, - "dirPior": 174, - "areaContigua": 68.1, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 14, - "z": -37, - "folgaParede": 4.75, - "dirPior": 276, - "areaContigua": 71.9, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -6, - "z": -37, - "folgaParede": 4.45, - "dirPior": 0, - "areaContigua": 68.6, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -14, - "z": -37, - "folgaParede": 4.75, - "dirPior": 264, - "areaContigua": 71.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -8, - "z": 29, - "folgaParede": 1.5, - "dirPior": 259, - "areaContigua": 54.7, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -2, - "z": 29, - "folgaParede": 1.5, - "dirPior": 259, - "areaContigua": 53.9, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 4, - "z": 29, - "folgaParede": 1.5, - "dirPior": 259, - "areaContigua": 52.1, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 10, - "z": 29, - "folgaParede": 2.2, - "dirPior": 225, - "areaContigua": 56.1, - "okFolga": true, - "okArea": true - } - ], - "piorFolga": 1.5, - "piorArea": 52.1, - "escadas": [], - "travessia": [], - "occluderSemMalha": [], - "occMedidos": 65, - "occPulados": 0, - "fracSemMalha": 0.0026, - "quadrantes": [ - { - "q": "0,0", - "x0": -25.5, - "z0": -41, - "areaAndavel": 179, - "props": 3, - "waypoints": 20, - "densProp": 1.68, - "densWp": 11.2, - "espacamento": 7.72, - "razaoProp": 0.44, - "razaoWp": 1.12 - }, - { - "q": "0,1", - "x0": -25.5, - "z0": -22.8, - "areaAndavel": 162, - "props": 5, - "waypoints": 20, - "densProp": 3.09, - "densWp": 12.35, - "espacamento": 5.69, - "razaoProp": 0.8, - "razaoWp": 1.23 - }, - { - "q": "0,2", - "x0": -25.5, - "z0": -4.5, - "areaAndavel": 198, - "props": 7, - "waypoints": 17, - "densProp": 3.54, - "densWp": 8.61, - "espacamento": 5.31, - "razaoProp": 0.92, - "razaoWp": 0.86 - }, - { - "q": "0,3", - "x0": -25.5, - "z0": 13.8, - "areaAndavel": 176, - "props": 12, - "waypoints": 19, - "densProp": 6.82, - "densWp": 10.79, - "espacamento": 3.83, - "razaoProp": 1.77, - "razaoWp": 1.08 - }, - { - "q": "1,0", - "x0": -12.8, - "z0": -41, - "areaAndavel": 178, - "props": 2, - "waypoints": 17, - "densProp": 1.12, - "densWp": 9.53, - "espacamento": 9.44, - "razaoProp": 0.29, - "razaoWp": 0.95 - }, - { - "q": "1,1", - "x0": -12.8, - "z0": -22.8, - "areaAndavel": 180, - "props": 5, - "waypoints": 19, - "densProp": 2.77, - "densWp": 10.54, - "espacamento": 6, - "razaoProp": 0.72, - "razaoWp": 1.05 - }, - { - "q": "1,2", - "x0": -12.8, - "z0": -4.5, - "areaAndavel": 190, - "props": 15, - "waypoints": 15, - "densProp": 7.88, - "densWp": 7.88, - "espacamento": 3.56, - "razaoProp": 2.05, - "razaoWp": 0.79 - }, - { - "q": "1,3", - "x0": -12.8, - "z0": 13.8, - "areaAndavel": 191, - "props": 18, - "waypoints": 15, - "densProp": 9.4, - "densWp": 7.84, - "espacamento": 3.26, - "razaoProp": 2.44, - "razaoWp": 0.78 - }, - { - "q": "2,0", - "x0": 0, - "z0": -41, - "areaAndavel": 162, - "props": 4, - "waypoints": 15, - "densProp": 2.47, - "densWp": 9.27, - "espacamento": 6.36, - "razaoProp": 0.64, - "razaoWp": 0.92 - }, - { - "q": "2,1", - "x0": 0, - "z0": -22.8, - "areaAndavel": 161, - "props": 7, - "waypoints": 18, - "densProp": 4.35, - "densWp": 11.18, - "espacamento": 4.79, - "razaoProp": 1.13, - "razaoWp": 1.11 - }, - { - "q": "2,2", - "x0": 0, - "z0": -4.5, - "areaAndavel": 189, - "props": 16, - "waypoints": 15, - "densProp": 8.46, - "densWp": 7.93, - "espacamento": 3.44, - "razaoProp": 2.2, - "razaoWp": 0.79 - }, - { - "q": "2,3", - "x0": 0, - "z0": 13.8, - "areaAndavel": 191, - "props": 18, - "waypoints": 15, - "densProp": 9.4, - "densWp": 7.84, - "espacamento": 3.26, - "razaoProp": 2.44, - "razaoWp": 0.78 - }, - { - "q": "3,0", - "x0": 12.8, - "z0": -41, - "areaAndavel": 197, - "props": 1, - "waypoints": 22, - "densProp": 0.51, - "densWp": 11.15, - "espacamento": 14.05, - "razaoProp": 0.13, - "razaoWp": 1.11 - }, - { - "q": "3,1", - "x0": 12.8, - "z0": -22.8, - "areaAndavel": 185, - "props": 3, - "waypoints": 22, - "densProp": 1.62, - "densWp": 11.91, - "espacamento": 7.85, - "razaoProp": 0.42, - "razaoWp": 1.19 - }, - { - "q": "3,2", - "x0": 12.8, - "z0": -4.5, - "areaAndavel": 193, - "props": 8, - "waypoints": 15, - "densProp": 4.15, - "densWp": 7.79, - "espacamento": 4.91, - "razaoProp": 1.08, - "razaoWp": 0.78 - }, - { - "q": "3,3", - "x0": 12.8, - "z0": 13.8, - "areaAndavel": 174, - "props": 13, - "waypoints": 19, - "densProp": 7.46, - "densWp": 10.9, - "espacamento": 3.66, - "razaoProp": 1.94, - "razaoWp": 1.09 - } - ], - "medianaProp": 3.845, - "medianaWp": 10.035, - "piorRazaoProp": 0.13, - "piorRazaoWp": 0.78, - "piorEspacamento": 14.05, - "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "E", - "rotas": 2, - "comprimentos": [ - 22.4, - 53.3 - ] - }, - { - "time": "E", - "bandeira": "MID", - "rotas": 2, - "comprimentos": [ - 33.3, - 37.9 - ] - }, - { - "time": "E", - "bandeira": "B", - "rotas": 2, - "comprimentos": [ - 70.6, - 87.2 - ] - }, - { - "time": "B", - "bandeira": "E", - "rotas": 2, - "comprimentos": [ - 60.3, - 86.6 - ] - }, - { - "time": "B", - "bandeira": "MID", - "rotas": 3, - "comprimentos": [ - 55.7, - 56.5, - 90.1 - ] - }, - { - "time": "B", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 9.1, - 9.1, - 9.1, - 9.1 - ] - } - ], - "piorRotas": 2, - "bandeiras": [ - { - "id": "E", - "label": "ESTACIONAMENTO", - "x": -8, - "z": -30, - "distSpawn": 7.28, - "timeSpawn": "E", - "maiorLinhaTiro": 62.9, - "chao": 0, - "penetracao": 0.01 - }, - { - "id": "MID", - "label": "PORTA", - "x": 10, - "z": -8, - "distSpawn": 29.27, - "timeSpawn": "E", - "maiorLinhaTiro": 45.6, - "chao": 0, - "penetracao": 0 - }, - { - "id": "B", - "label": "DOCA", - "x": -8, - "z": 24, - "distSpawn": 5, - "timeSpawn": "B", - "maiorLinhaTiro": 64.4, - "chao": 0, - "penetracao": 0 - } - ], - "alturaTrianguloMin": 18 - }, - { - "map": "parque_treta", - "celulasAlcancadas": 71572, - "amostrasChao": 4496, - "observadores": 1113, - "corpoDentroDeSolido": 20, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 1.06, - "piores": [ - { - "tipo": "chao", - "x": -20.2, - "z": -31.2, - "pen": 1.06 - }, - { - "tipo": "chao", - "x": -20.2, - "z": 30.8, - "pen": 1.06 - }, - { - "tipo": "chao", - "x": -23.2, - "z": -31.2, - "pen": 0.7 - }, - { - "tipo": "chao", - "x": -23.2, - "z": 30.8, - "pen": 0.7 - }, - { - "tipo": "chao", - "x": -16.2, - "z": -12.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": -11.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": 11.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": 12.8, - "pen": 0.45 - } - ], - "dentroTodos": [ - { - "tipo": "chao", - "x": -20.2, - "z": -31.2, - "pen": 1.06 - }, - { - "tipo": "chao", - "x": -20.2, - "z": 30.8, - "pen": 1.06 - }, - { - "tipo": "chao", - "x": -23.2, - "z": -31.2, - "pen": 0.7 - }, - { - "tipo": "chao", - "x": -23.2, - "z": 30.8, - "pen": 0.7 - }, - { - "tipo": "chao", - "x": -16.2, - "z": -12.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": -11.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": 11.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -16.2, - "z": 12.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -15.2, - "z": -12.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -15.2, - "z": -11.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -15.2, - "z": 11.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": -15.2, - "z": 12.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 15.8, - "z": -12.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 15.8, - "z": -11.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 15.8, - "z": 11.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 15.8, - "z": 12.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 16.8, - "z": -12.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 16.8, - "z": -11.2, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 16.8, - "z": 11.8, - "pen": 0.45 - }, - { - "tipo": "chao", - "x": 16.8, - "z": 12.8, - "pen": 0.45 - } - ], - "spawns": [ - { - "team": "E", - "x": -9, - "z": -38.5, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "E", - "x": -3, - "z": -38.5, - "chao": 0, - "penetracao": 0.025 - }, - { - "team": "E", - "x": 3, - "z": -38.5, - "chao": 0, - "penetracao": 0.025 - }, - { - "team": "E", - "x": 9, - "z": -38.5, - "chao": 0, - "penetracao": 0.01 - }, - { - "team": "B", - "x": -9, - "z": 38.5, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -3, - "z": 38.5, - "chao": 0, - "penetracao": 0.025 - }, - { - "team": "B", - "x": 3, - "z": 38.5, - "chao": 0, - "penetracao": 0.025 - }, - { - "team": "B", - "x": 9, - "z": 38.5, - "chao": 0, - "penetracao": 0 - } - ], - "exposicaoPorTime": [ - { - "team": "E", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.519, - "maiorVisada": 86.2 - }, - { - "team": "B", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.5222, - "maiorVisada": 84.1 - } - ], - "exposicaoPorSpawn": [ - { - "team": "E", - "x": -9, - "z": -38.5, - "chao": 0, - "obsLonge": 881, - "obsVendo": 367, - "frac": 0.4166, - "maiorVisada": 83.4 - }, - { - "team": "E", - "x": -3, - "z": -38.5, - "chao": 0, - "obsLonge": 876, - "obsVendo": 549, - "frac": 0.6267, - "maiorVisada": 86.2 - }, - { - "team": "E", - "x": 3, - "z": -38.5, - "chao": 0, - "obsLonge": 874, - "obsVendo": 560, - "frac": 0.6407, - "maiorVisada": 85.6 - }, - { - "team": "E", - "x": 9, - "z": -38.5, - "chao": 0, - "obsLonge": 875, - "obsVendo": 343, - "frac": 0.392, - "maiorVisada": 82.9 - }, - { - "team": "B", - "x": -9, - "z": 38.5, - "chao": 0, - "obsLonge": 862, - "obsVendo": 360, - "frac": 0.4176, - "maiorVisada": 81.3 - }, - { - "team": "B", - "x": -3, - "z": 38.5, - "chao": 0, - "obsLonge": 855, - "obsVendo": 537, - "frac": 0.6281, - "maiorVisada": 84 - }, - { - "team": "B", - "x": 3, - "z": 38.5, - "chao": 0, - "obsLonge": 855, - "obsVendo": 550, - "frac": 0.6433, - "maiorVisada": 84.1 - }, - { - "team": "B", - "x": 9, - "z": 38.5, - "chao": 0, - "obsLonge": 855, - "obsVendo": 342, - "frac": 0.4, - "maiorVisada": 81.4 - } - ], - "salaDoSpawn": [ - { - "team": "E", - "x": -9, - "z": -38.5, - "folgaParede": 2.75, - "dirPior": 264, - "areaContigua": 58.7, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -3, - "z": -38.5, - "folgaParede": 2.75, - "dirPior": 264, - "areaContigua": 60.8, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 3, - "z": -38.5, - "folgaParede": 2.75, - "dirPior": 264, - "areaContigua": 61.1, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 9, - "z": -38.5, - "folgaParede": 2.75, - "dirPior": 264, - "areaContigua": 58.7, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -9, - "z": 38.5, - "folgaParede": 2.75, - "dirPior": 84, - "areaContigua": 59.8, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -3, - "z": 38.5, - "folgaParede": 2.75, - "dirPior": 84, - "areaContigua": 61.8, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 3, - "z": 38.5, - "folgaParede": 2.75, - "dirPior": 84, - "areaContigua": 61.9, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 9, - "z": 38.5, - "folgaParede": 2.75, - "dirPior": 84, - "areaContigua": 59.7, - "okFolga": true, - "okArea": true - } - ], - "piorFolga": 2.75, - "piorArea": 58.7, - "escadas": [], - "travessia": [], - "occluderSemMalha": [], - "occMedidos": 48, - "occPulados": 0, - "fracSemMalha": 0.0037, - "quadrantes": [ - { - "q": "0,0", - "x0": -31.2, - "z0": -41.2, - "areaAndavel": 301, - "props": 1, - "waypoints": 33, - "densProp": 0.33, - "densWp": 10.97, - "espacamento": 17.34, - "razaoProp": 0.33, - "razaoWp": 1.19 - }, - { - "q": "0,1", - "x0": -31.2, - "z0": -20.6, - "areaAndavel": 286, - "props": 2, - "waypoints": 26, - "densProp": 0.7, - "densWp": 9.09, - "espacamento": 11.96, - "razaoProp": 0.69, - "razaoWp": 0.99 - }, - { - "q": "0,2", - "x0": -31.2, - "z0": 0, - "areaAndavel": 290, - "props": 3, - "waypoints": 26, - "densProp": 1.04, - "densWp": 8.97, - "espacamento": 9.83, - "razaoProp": 1.03, - "razaoWp": 0.97 - }, - { - "q": "0,3", - "x0": -31.2, - "z0": 20.6, - "areaAndavel": 301, - "props": 1, - "waypoints": 28, - "densProp": 0.33, - "densWp": 9.31, - "espacamento": 17.34, - "razaoProp": 0.33, - "razaoWp": 1.01 - }, - { - "q": "1,0", - "x0": -15.6, - "z0": -41.2, - "areaAndavel": 297, - "props": 3, - "waypoints": 33, - "densProp": 1.01, - "densWp": 11.11, - "espacamento": 9.95, - "razaoProp": 1, - "razaoWp": 1.2 - }, - { - "q": "1,1", - "x0": -15.6, - "z0": -20.6, - "areaAndavel": 245, - "props": 3, - "waypoints": 23, - "densProp": 1.23, - "densWp": 9.4, - "espacamento": 9.03, - "razaoProp": 1.22, - "razaoWp": 1.02 - }, - { - "q": "1,2", - "x0": -15.6, - "z0": 0, - "areaAndavel": 247, - "props": 3, - "waypoints": 23, - "densProp": 1.21, - "densWp": 9.31, - "espacamento": 9.08, - "razaoProp": 1.2, - "razaoWp": 1.01 - }, - { - "q": "1,3", - "x0": -15.6, - "z0": 20.6, - "areaAndavel": 298, - "props": 3, - "waypoints": 28, - "densProp": 1.01, - "densWp": 9.39, - "espacamento": 9.97, - "razaoProp": 1, - "razaoWp": 1.02 - }, - { - "q": "2,0", - "x0": 0, - "z0": -41.2, - "areaAndavel": 302, - "props": 3, - "waypoints": 33, - "densProp": 0.99, - "densWp": 10.93, - "espacamento": 10.03, - "razaoProp": 0.98, - "razaoWp": 1.18 - }, - { - "q": "2,1", - "x0": 0, - "z0": -20.6, - "areaAndavel": 249, - "props": 3, - "waypoints": 23, - "densProp": 1.2, - "densWp": 9.22, - "espacamento": 9.12, - "razaoProp": 1.19, - "razaoWp": 1 - }, - { - "q": "2,2", - "x0": 0, - "z0": 0, - "areaAndavel": 252, - "props": 4, - "waypoints": 23, - "densProp": 1.59, - "densWp": 9.13, - "espacamento": 7.94, - "razaoProp": 1.57, - "razaoWp": 0.99 - }, - { - "q": "2,3", - "x0": 0, - "z0": 20.6, - "areaAndavel": 303, - "props": 3, - "waypoints": 28, - "densProp": 0.99, - "densWp": 9.23, - "espacamento": 10.06, - "razaoProp": 0.98, - "razaoWp": 1 - }, - { - "q": "3,0", - "x0": 15.6, - "z0": -41.2, - "areaAndavel": 301, - "props": 1, - "waypoints": 27, - "densProp": 0.33, - "densWp": 8.98, - "espacamento": 17.34, - "razaoProp": 0.33, - "razaoWp": 0.97 - }, - { - "q": "3,1", - "x0": 15.6, - "z0": -20.6, - "areaAndavel": 250, - "props": 4, - "waypoints": 17, - "densProp": 1.6, - "densWp": 6.81, - "espacamento": 7.9, - "razaoProp": 1.58, - "razaoWp": 0.74 - }, - { - "q": "3,2", - "x0": 15.6, - "z0": 0, - "areaAndavel": 251, - "props": 4, - "waypoints": 16, - "densProp": 1.59, - "densWp": 6.37, - "espacamento": 7.92, - "razaoProp": 1.57, - "razaoWp": 0.69 - }, - { - "q": "3,3", - "x0": 15.6, - "z0": 20.6, - "areaAndavel": 301, - "props": 1, - "waypoints": 23, - "densProp": 0.33, - "densWp": 7.64, - "espacamento": 17.35, - "razaoProp": 0.33, - "razaoWp": 0.83 - } - ], - "medianaProp": 1.01, - "medianaWp": 9.225000000000001, - "piorRazaoProp": 0.33, - "piorRazaoWp": 0.69, - "piorEspacamento": 17.35, - "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 28.3, - 30.9, - 41.8, - 74.6 - ] - }, - { - "time": "E", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 56.5, - 63.7, - 67.4, - 89.3 - ] - }, - { - "time": "E", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 80.2, - 85.5, - 90.8, - 122.1 - ] - }, - { - "time": "B", - "bandeira": "E", - "rotas": 3, - "comprimentos": [ - 82.9, - 89, - 108.2 - ] - }, - { - "time": "B", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 30.1, - 32.8, - 41.8, - 46.4 - ] - }, - { - "time": "B", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 10.9, - 10.9, - 10.9, - 10.9 - ] - } - ], - "piorRotas": 3, - "bandeiras": [ - { - "id": "E", - "label": "PORTAL ROSA", - "x": 18, - "z": -33, - "distSpawn": 10.55, - "timeSpawn": "E", - "maiorLinhaTiro": 84.3, - "chao": 0, - "penetracao": 0.025 - }, - { - "id": "MID", - "label": "CARROSSEL", - "x": 0, - "z": 10, - "distSpawn": 28.66, - "timeSpawn": "B", - "maiorLinhaTiro": 58, - "chao": 0, - "penetracao": 0.04 - }, - { - "id": "B", - "label": "PORTAL AZUL", - "x": -18, - "z": 33, - "distSpawn": 10.55, - "timeSpawn": "B", - "maiorLinhaTiro": 87.1, - "chao": 0, - "penetracao": 0.045 - } - ], - "alturaTrianguloMin": 4.79 - }, - { - "map": "velho_oeste", - "celulasAlcancadas": 71310, - "amostrasChao": 4460, - "observadores": 1107, - "corpoDentroDeSolido": 0, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 0, - "piores": [], - "dentroTodos": [], - "spawns": [ - { - "team": "E", - "x": -12, - "z": -41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": -4, - "z": -41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": 4, - "z": -41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": 12, - "z": -41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 12, - "z": 41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 4, - "z": 41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -4, - "z": 41, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -12, - "z": 41, - "chao": 0, - "penetracao": 0 - } - ], - "exposicaoPorTime": [ - { - "team": "E", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.6337, - "maiorVisada": 92 - }, - { - "team": "B", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.666, - "maiorVisada": 89.8 - } - ], - "exposicaoPorSpawn": [ - { - "team": "E", - "x": -12, - "z": -41, - "chao": 0, - "obsLonge": 902, - "obsVendo": 555, - "frac": 0.6153, - "maiorVisada": 91.2 - }, - { - "team": "E", - "x": -4, - "z": -41, - "chao": 0, - "obsLonge": 868, - "obsVendo": 572, - "frac": 0.659, - "maiorVisada": 91.9 - }, - { - "team": "E", - "x": 4, - "z": -41, - "chao": 0, - "obsLonge": 862, - "obsVendo": 564, - "frac": 0.6543, - "maiorVisada": 92 - }, - { - "team": "E", - "x": 12, - "z": -41, - "chao": 0, - "obsLonge": 886, - "obsVendo": 537, - "frac": 0.6061, - "maiorVisada": 91.3 - }, - { - "team": "B", - "x": 12, - "z": 41, - "chao": 0, - "obsLonge": 861, - "obsVendo": 550, - "frac": 0.6388, - "maiorVisada": 89.8 - }, - { - "team": "B", - "x": 4, - "z": 41, - "chao": 0, - "obsLonge": 835, - "obsVendo": 579, - "frac": 0.6934, - "maiorVisada": 87.9 - }, - { - "team": "B", - "x": -4, - "z": 41, - "chao": 0, - "obsLonge": 835, - "obsVendo": 572, - "frac": 0.685, - "maiorVisada": 87.3 - }, - { - "team": "B", - "x": -12, - "z": 41, - "chao": 0, - "obsLonge": 869, - "obsVendo": 562, - "frac": 0.6467, - "maiorVisada": 89.7 - } - ], - "salaDoSpawn": [ - { - "team": "E", - "x": -12, - "z": -41, - "folgaParede": 4.9, - "dirPior": 270, - "areaContigua": 73.4, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -4, - "z": -41, - "folgaParede": 5.25, - "dirPior": 247, - "areaContigua": 73.4, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 4, - "z": -41, - "folgaParede": 5.25, - "dirPior": 293, - "areaContigua": 73.4, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 12, - "z": -41, - "folgaParede": 4.9, - "dirPior": 270, - "areaContigua": 73.4, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 12, - "z": 41, - "folgaParede": 4.9, - "dirPior": 90, - "areaContigua": 74.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 4, - "z": 41, - "folgaParede": 5.25, - "dirPior": 68, - "areaContigua": 74.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -4, - "z": 41, - "folgaParede": 5.25, - "dirPior": 113, - "areaContigua": 74.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -12, - "z": 41, - "folgaParede": 4.4, - "dirPior": 264, - "areaContigua": 71.3, - "okFolga": true, - "okArea": true - } - ], - "piorFolga": 4.4, - "piorArea": 71.3, - "escadas": [], - "travessia": [], - "occluderSemMalha": [], - "occMedidos": 56, - "occPulados": 11, - "fracSemMalha": 0.0032, - "quadrantes": [ - { - "q": "0,0", - "x0": -33.2, - "z0": -45.2, - "areaAndavel": 239, - "props": 1, - "waypoints": 23, - "densProp": 0.42, - "densWp": 9.63, - "espacamento": 15.46, - "razaoProp": 0.64, - "razaoWp": 1.11 - }, - { - "q": "0,1", - "x0": -33.2, - "z0": -22.6, - "areaAndavel": 257, - "props": 2, - "waypoints": 28, - "densProp": 0.78, - "densWp": 10.91, - "espacamento": 11.33, - "razaoProp": 1.19, - "razaoWp": 1.26 - }, - { - "q": "0,2", - "x0": -33.2, - "z0": 0, - "areaAndavel": 239, - "props": 1, - "waypoints": 18, - "densProp": 0.42, - "densWp": 7.55, - "espacamento": 15.45, - "razaoProp": 0.64, - "razaoWp": 0.87 - }, - { - "q": "0,3", - "x0": -33.2, - "z0": 22.6, - "areaAndavel": 253, - "props": 1, - "waypoints": 27, - "densProp": 0.4, - "densWp": 10.68, - "espacamento": 15.9, - "razaoProp": 0.61, - "razaoWp": 1.23 - }, - { - "q": "1,0", - "x0": -16.6, - "z0": -45.2, - "areaAndavel": 347, - "props": 1, - "waypoints": 30, - "densProp": 0.29, - "densWp": 8.65, - "espacamento": 18.62, - "razaoProp": 0.44, - "razaoWp": 1 - }, - { - "q": "1,1", - "x0": -16.6, - "z0": -22.6, - "areaAndavel": 252, - "props": 7, - "waypoints": 22, - "densProp": 2.77, - "densWp": 8.72, - "espacamento": 6.01, - "razaoProp": 4.23, - "razaoWp": 1 - }, - { - "q": "1,2", - "x0": -16.6, - "z0": 0, - "areaAndavel": 293, - "props": 5, - "waypoints": 24, - "densProp": 1.71, - "densWp": 8.2, - "espacamento": 7.65, - "razaoProp": 2.61, - "razaoWp": 0.94 - }, - { - "q": "1,3", - "x0": -16.6, - "z0": 22.6, - "areaAndavel": 309, - "props": 4, - "waypoints": 27, - "densProp": 1.3, - "densWp": 8.75, - "espacamento": 8.78, - "razaoProp": 1.98, - "razaoWp": 1.01 - }, - { - "q": "2,0", - "x0": 0, - "z0": -45.2, - "areaAndavel": 355, - "props": 3, - "waypoints": 32, - "densProp": 0.84, - "densWp": 9.01, - "espacamento": 10.88, - "razaoProp": 1.28, - "razaoWp": 1.04 - }, - { - "q": "2,1", - "x0": 0, - "z0": -22.6, - "areaAndavel": 286, - "props": 4, - "waypoints": 27, - "densProp": 1.4, - "densWp": 9.46, - "espacamento": 8.45, - "razaoProp": 2.14, - "razaoWp": 1.09 - }, - { - "q": "2,2", - "x0": 0, - "z0": 0, - "areaAndavel": 276, - "props": 7, - "waypoints": 22, - "densProp": 2.53, - "densWp": 7.96, - "espacamento": 6.28, - "razaoProp": 3.86, - "razaoWp": 0.92 - }, - { - "q": "2,3", - "x0": 0, - "z0": 22.6, - "areaAndavel": 357, - "props": 2, - "waypoints": 32, - "densProp": 0.56, - "densWp": 8.96, - "espacamento": 13.36, - "razaoProp": 0.85, - "razaoWp": 1.03 - }, - { - "q": "3,0", - "x0": 16.6, - "z0": -45.2, - "areaAndavel": 249, - "props": 1, - "waypoints": 19, - "densProp": 0.4, - "densWp": 7.64, - "espacamento": 15.77, - "razaoProp": 0.61, - "razaoWp": 0.88 - }, - { - "q": "3,1", - "x0": 16.6, - "z0": -22.6, - "areaAndavel": 241, - "props": 0, - "waypoints": 20, - "densProp": 0, - "densWp": 8.31, - "espacamento": 99, - "razaoProp": 0, - "razaoWp": 0.96 - }, - { - "q": "3,2", - "x0": 16.6, - "z0": 0, - "areaAndavel": 239, - "props": 1, - "waypoints": 16, - "densProp": 0.42, - "densWp": 6.7, - "espacamento": 15.46, - "razaoProp": 0.64, - "razaoWp": 0.77 - }, - { - "q": "3,3", - "x0": 16.6, - "z0": 22.6, - "areaAndavel": 268, - "props": 2, - "waypoints": 21, - "densProp": 0.75, - "densWp": 7.85, - "espacamento": 11.57, - "razaoProp": 1.15, - "razaoWp": 0.9 - } - ], - "medianaProp": 0.655, - "medianaWp": 8.685, - "piorRazaoProp": 0, - "piorRazaoWp": 0.77, - "piorEspacamento": 99, - "rotasSpawnBandeira": [ - { - "time": "E", - "bandeira": "E", - "rotas": 4, - "comprimentos": [ - 8.2, - 8.2, - 8.2, - 8.2 - ] - }, - { - "time": "E", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 49.8, - 52.6, - 71.9, - 108.7 - ] - }, - { - "time": "E", - "bandeira": "B", - "rotas": 3, - "comprimentos": [ - 90, - 95.7, - 103.6 - ] - }, - { - "time": "B", - "bandeira": "E", - "rotas": 2, - "comprimentos": [ - 88.9, - 95.7 - ] - }, - { - "time": "B", - "bandeira": "MID", - "rotas": 4, - "comprimentos": [ - 46.4, - 54.1, - 71.6, - 80.1 - ] - }, - { - "time": "B", - "bandeira": "B", - "rotas": 4, - "comprimentos": [ - 3.4, - 3.4, - 3.4, - 3.4 - ] - } - ], - "piorRotas": 2, - "bandeiras": [ - { - "id": "E", - "label": "SALOON", - "x": -12, - "z": -34, - "distSpawn": 7, - "timeSpawn": "E", - "maiorLinhaTiro": 85.4, - "chao": 0, - "penetracao": 0 - }, - { - "id": "MID", - "label": "RUA PRINCIPAL", - "x": 0, - "z": 0, - "distSpawn": 41.19, - "timeSpawn": "E", - "maiorLinhaTiro": 49.4, - "chao": 0, - "penetracao": 0 - }, - { - "id": "B", - "label": "ESTÁBULO", - "x": 12, - "z": 34, - "distSpawn": 7, - "timeSpawn": "B", - "maiorLinhaTiro": 83.3, - "chao": 0, - "penetracao": 1.08 - } - ], - "alturaTrianguloMin": 0 - }, - { - "map": "penitenciaria", - "celulasAlcancadas": 99250, - "amostrasChao": 6079, - "observadores": 1530, - "corpoDentroDeSolido": 14, - "submersosAcimaDoPeito": 0, - "piorPenetracao": 1.02, - "piores": [ - { - "tipo": "chao", - "x": -15.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -14.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -13.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -13.1, - "z": -1.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -4.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -3.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -2.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": 2.9, - "z": -7.1, - "pen": 1.02 - } - ], - "dentroTodos": [ - { - "tipo": "chao", - "x": -15.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -14.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -13.1, - "z": -2.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -13.1, - "z": -1.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -4.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -3.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -2.1, - "z": -13.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": 2.9, - "z": -7.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": 2.9, - "z": -6.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": 2.9, - "z": -5.1, - "pen": 1.02 - }, - { - "tipo": "chao", - "x": -19.1, - "z": -16.1, - "pen": 0.575 - }, - { - "tipo": "chao", - "x": 3.9, - "z": 22.9, - "pen": 0.575 - }, - { - "tipo": "chao", - "x": -7.1, - "z": -2.1, - "pen": 0.32 - }, - { - "tipo": "chao", - "x": -1.1, - "z": -2.1, - "pen": 0.32 - } - ], - "spawns": [ - { - "team": "E", - "x": -15, - "z": -42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": -5, - "z": -42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": 5, - "z": -42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "E", - "x": 15, - "z": -42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 15, - "z": 42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": 5, - "z": 42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -5, - "z": 42, - "chao": 0, - "penetracao": 0 - }, - { - "team": "B", - "x": -15, - "z": 42, - "chao": 0, - "penetracao": 0 - } - ], - "exposicaoPorTime": [ - { - "team": "E", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.7932, - "maiorVisada": 97.4 - }, - { - "team": "B", - "chaoMin": 0, - "chaoMax": 0, - "fracMedia": 0.7614, - "maiorVisada": 98.5 - } - ], - "exposicaoPorSpawn": [ - { - "team": "E", - "x": -15, - "z": -42, - "chao": 0, - "obsLonge": 1259, - "obsVendo": 1005, - "frac": 0.7983, - "maiorVisada": 97.4 - }, - { - "team": "E", - "x": -5, - "z": -42, - "chao": 0, - "obsLonge": 1237, - "obsVendo": 977, - "frac": 0.7898, - "maiorVisada": 93.3 - }, - { - "team": "E", - "x": 5, - "z": -42, - "chao": 0, - "obsLonge": 1243, - "obsVendo": 978, - "frac": 0.7868, - "maiorVisada": 93.4 - }, - { - "team": "E", - "x": 15, - "z": -42, - "chao": 0, - "obsLonge": 1267, - "obsVendo": 1011, - "frac": 0.7979, - "maiorVisada": 97.4 - }, - { - "team": "B", - "x": 15, - "z": 42, - "chao": 0, - "obsLonge": 1258, - "obsVendo": 984, - "frac": 0.7822, - "maiorVisada": 97.6 - }, - { - "team": "B", - "x": 5, - "z": 42, - "chao": 0, - "obsLonge": 1239, - "obsVendo": 951, - "frac": 0.7676, - "maiorVisada": 93.5 - }, - { - "team": "B", - "x": -5, - "z": 42, - "chao": 0, - "obsLonge": 1238, - "obsVendo": 956, - "frac": 0.7722, - "maiorVisada": 93.5 - }, - { - "team": "B", - "x": -15, - "z": 42, - "chao": 0, - "obsLonge": 1259, - "obsVendo": 911, - "frac": 0.7236, - "maiorVisada": 98.5 - } - ], - "salaDoSpawn": [ - { - "team": "E", - "x": -15, - "z": -42, - "folgaParede": 5.55, - "dirPior": 264, - "areaContigua": 78.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": -5, - "z": -42, - "folgaParede": 5.55, - "dirPior": 264, - "areaContigua": 78.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 5, - "z": -42, - "folgaParede": 5.55, - "dirPior": 264, - "areaContigua": 78.3, - "okFolga": true, - "okArea": true - }, - { - "team": "E", - "x": 15, - "z": -42, - "folgaParede": 5.55, - "dirPior": 264, - "areaContigua": 78.3, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 15, - "z": 42, - "folgaParede": 5.55, - "dirPior": 84, - "areaContigua": 78.4, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": 5, - "z": 42, - "folgaParede": 5.55, - "dirPior": 84, - "areaContigua": 78.4, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -5, - "z": 42, - "folgaParede": 5.55, - "dirPior": 84, - "areaContigua": 78.4, - "okFolga": true, - "okArea": true - }, - { - "team": "B", - "x": -15, - "z": 42, - "folgaParede": 3.95, - "dirPior": 276, - "areaContigua": 73, - "okFolga": true, - "okArea": true - } - ], - "piorFolga": 3.95, - "piorArea": 73, - "escadas": [], - "travessia": [], - "occluderSemMalha": [], - "occMedidos": 77, - "occPulados": 1, - "fracSemMalha": 0.0014, - "quadrantes": [ - { - "q": "0,0", - "x0": -37.1, - "z0": -47.1, - "areaAndavel": 372, - "props": 12, - "waypoints": 38, - "densProp": 3.23, - "densWp": 10.22, - "espacamento": 5.57, - "razaoProp": 1.67, - "razaoWp": 1.06 + "x0": -27.5, + "z0": -34.5, + "areaAndavel": 222, + "props": 0, + "waypoints": 20, + "densProp": 0, + "densWp": 9.01, + "espacamento": 99, + "razaoProp": 0, + "razaoWp": 1 }, { "q": "0,1", - "x0": -37.1, - "z0": -23.6, - "areaAndavel": 363, + "x0": -27.5, + "z0": -17.3, + "areaAndavel": 212, "props": 7, - "waypoints": 39, - "densProp": 1.93, - "densWp": 10.73, - "espacamento": 7.2, - "razaoProp": 1, - "razaoWp": 1.12 + "waypoints": 23, + "densProp": 3.3, + "densWp": 10.84, + "espacamento": 5.51, + "razaoProp": 2.4, + "razaoWp": 1.2 }, { "q": "0,2", - "x0": -37.1, + "x0": -27.5, "z0": 0, - "areaAndavel": 362, - "props": 7, - "waypoints": 42, - "densProp": 1.93, - "densWp": 11.59, - "espacamento": 7.19, - "razaoProp": 1, - "razaoWp": 1.2 + "areaAndavel": 215, + "props": 8, + "waypoints": 20, + "densProp": 3.72, + "densWp": 9.29, + "espacamento": 5.19, + "razaoProp": 2.71, + "razaoWp": 1.03 }, { "q": "0,3", - "x0": -37.1, - "z0": 23.6, - "areaAndavel": 371, - "props": 13, - "waypoints": 38, - "densProp": 3.5, - "densWp": 10.23, - "espacamento": 5.34, - "razaoProp": 1.81, - "razaoWp": 1.06 + "x0": -27.5, + "z0": 17.3, + "areaAndavel": 202, + "props": 2, + "waypoints": 19, + "densProp": 0.99, + "densWp": 9.39, + "espacamento": 10.06, + "razaoProp": 0.72, + "razaoWp": 1.04 }, { "q": "1,0", - "x0": -18.6, - "z0": -47.1, - "areaAndavel": 424, + "x0": -13.8, + "z0": -34.5, + "areaAndavel": 225, "props": 1, - "waypoints": 47, - "densProp": 0.24, - "densWp": 11.08, - "espacamento": 20.6, - "razaoProp": 0.12, - "razaoWp": 1.15 + "waypoints": 25, + "densProp": 0.44, + "densWp": 11.12, + "espacamento": 15, + "razaoProp": 0.32, + "razaoWp": 1.23 }, { "q": "1,1", - "x0": -18.6, - "z0": -23.6, - "areaAndavel": 412, - "props": 2, - "waypoints": 36, - "densProp": 0.49, - "densWp": 8.74, - "espacamento": 14.35, - "razaoProp": 0.25, - "razaoWp": 0.91 + "x0": -13.8, + "z0": -17.3, + "areaAndavel": 208, + "props": 3, + "waypoints": 22, + "densProp": 1.45, + "densWp": 10.6, + "espacamento": 8.32, + "razaoProp": 1.05, + "razaoWp": 1.18 }, { "q": "1,2", - "x0": -18.6, + "x0": -13.8, "z0": 0, - "areaAndavel": 400, - "props": 4, - "waypoints": 40, - "densProp": 1, - "densWp": 10, - "espacamento": 10, - "razaoProp": 0.52, - "razaoWp": 1.04 + "areaAndavel": 208, + "props": 3, + "waypoints": 18, + "densProp": 1.45, + "densWp": 8.67, + "espacamento": 8.32, + "razaoProp": 1.05, + "razaoWp": 0.96 }, { "q": "1,3", - "x0": -18.6, - "z0": 23.6, - "areaAndavel": 418, - "props": 6, - "waypoints": 40, - "densProp": 1.44, - "densWp": 9.57, - "espacamento": 8.35, - "razaoProp": 0.75, - "razaoWp": 0.99 + "x0": -13.8, + "z0": 17.3, + "areaAndavel": 228, + "props": 2, + "waypoints": 24, + "densProp": 0.88, + "densWp": 10.55, + "espacamento": 10.67, + "razaoProp": 0.64, + "razaoWp": 1.17 }, { "q": "2,0", "x0": 0, - "z0": -47.1, - "areaAndavel": 409, - "props": 1, - "waypoints": 44, - "densProp": 0.24, - "densWp": 10.76, - "espacamento": 20.22, - "razaoProp": 0.12, - "razaoWp": 1.12 + "z0": -34.5, + "areaAndavel": 225, + "props": 3, + "waypoints": 20, + "densProp": 1.33, + "densWp": 8.89, + "espacamento": 8.66, + "razaoProp": 0.97, + "razaoWp": 0.99 }, { "q": "2,1", "x0": 0, - "z0": -23.6, - "areaAndavel": 398, - "props": 5, - "waypoints": 37, - "densProp": 1.26, - "densWp": 9.3, - "espacamento": 8.92, - "razaoProp": 0.65, - "razaoWp": 0.97 + "z0": -17.3, + "areaAndavel": 211, + "props": 3, + "waypoints": 19, + "densProp": 1.42, + "densWp": 9.02, + "espacamento": 8.38, + "razaoProp": 1.03, + "razaoWp": 1 }, { "q": "2,2", "x0": 0, "z0": 0, - "areaAndavel": 390, - "props": 9, - "waypoints": 35, - "densProp": 2.31, - "densWp": 8.98, - "espacamento": 6.58, - "razaoProp": 1.2, - "razaoWp": 0.93 + "areaAndavel": 212, + "props": 3, + "waypoints": 16, + "densProp": 1.42, + "densWp": 7.56, + "espacamento": 8.4, + "razaoProp": 1.03, + "razaoWp": 0.84 }, { "q": "2,3", "x0": 0, - "z0": 23.6, - "areaAndavel": 424, + "z0": 17.3, + "areaAndavel": 228, "props": 1, - "waypoints": 41, - "densProp": 0.24, - "densWp": 9.67, - "espacamento": 20.6, - "razaoProp": 0.12, - "razaoWp": 1.01 + "waypoints": 17, + "densProp": 0.44, + "densWp": 7.45, + "espacamento": 15.1, + "razaoProp": 0.32, + "razaoWp": 0.83 }, { "q": "3,0", - "x0": 18.6, - "z0": -47.1, - "areaAndavel": 369, - "props": 11, - "waypoints": 26, - "densProp": 2.98, - "densWp": 7.05, - "espacamento": 5.79, - "razaoProp": 1.54, - "razaoWp": 0.73 + "x0": 13.8, + "z0": -34.5, + "areaAndavel": 192, + "props": 2, + "waypoints": 17, + "densProp": 1.04, + "densWp": 8.85, + "espacamento": 9.8, + "razaoProp": 0.76, + "razaoWp": 0.98 }, { "q": "3,1", - "x0": 18.6, - "z0": -23.6, - "areaAndavel": 356, - "props": 8, - "waypoints": 25, - "densProp": 2.25, - "densWp": 7.02, - "espacamento": 6.67, - "razaoProp": 1.17, - "razaoWp": 0.73 + "x0": 13.8, + "z0": -17.3, + "areaAndavel": 204, + "props": 4, + "waypoints": 20, + "densProp": 1.96, + "densWp": 9.8, + "espacamento": 7.14, + "razaoProp": 1.43, + "razaoWp": 1.09 }, { "q": "3,2", - "x0": 18.6, + "x0": 13.8, "z0": 0, - "areaAndavel": 363, - "props": 7, - "waypoints": 28, - "densProp": 1.93, - "densWp": 7.72, - "espacamento": 7.2, - "razaoProp": 1, - "razaoWp": 0.8 + "areaAndavel": 201, + "props": 9, + "waypoints": 17, + "densProp": 4.47, + "densWp": 8.44, + "espacamento": 4.73, + "razaoProp": 3.25, + "razaoWp": 0.94 }, { "q": "3,3", - "x0": 18.6, - "z0": 23.6, - "areaAndavel": 371, - "props": 12, - "waypoints": 28, - "densProp": 3.23, - "densWp": 7.54, - "espacamento": 5.56, - "razaoProp": 1.67, - "razaoWp": 0.78 + "x0": 13.8, + "z0": 17.3, + "areaAndavel": 209, + "props": 2, + "waypoints": 17, + "densProp": 0.96, + "densWp": 8.15, + "espacamento": 10.21, + "razaoProp": 0.7, + "razaoWp": 0.9 } ], - "medianaProp": 1.93, - "medianaWp": 9.620000000000001, - "piorRazaoProp": 0.12, - "piorRazaoWp": 0.73, - "piorEspacamento": 20.6, + "medianaProp": 1.375, + "medianaWp": 9.015, + "piorRazaoProp": 0, + "piorRazaoWp": 0.83, + "piorEspacamento": 99, "rotasSpawnBandeira": [ { "time": "E", "bandeira": "E", "rotas": 4, "comprimentos": [ - 14.1, - 14.1, - 14.1, - 14.1 + 28.3, + 33.6, + 41.8, + 46.4 ] }, { @@ -9956,10 +6788,10 @@ "bandeira": "MID", "rotas": 4, "comprimentos": [ - 46.9, - 49.6, - 58.6, - 60.5 + 31.5, + 41.3, + 56.7, + 64.2 ] }, { @@ -9967,10 +6799,10 @@ "bandeira": "B", "rotas": 4, "comprimentos": [ - 88.5, - 96.5, - 96.5, - 113.8 + 48.8, + 57.8, + 58.6, + 73.3 ] }, { @@ -9978,10 +6810,10 @@ "bandeira": "E", "rotas": 4, "comprimentos": [ - 89.8, - 95.1, - 95.1, - 112.5 + 46.9, + 49.6, + 58.6, + 65.8 ] }, { @@ -9989,10 +6821,10 @@ "bandeira": "MID", "rotas": 4, "comprimentos": [ - 51.4, - 54.1, - 65, - 70.6 + 34.7, + 41.8, + 44.5, + 61.8 ] }, { @@ -10000,10 +6832,10 @@ "bandeira": "B", "rotas": 4, "comprimentos": [ - 17.3, - 17.3, - 17.3, - 17.3 + 20, + 20, + 20, + 20 ] } ], @@ -10011,45 +6843,45 @@ "bandeiras": [ { "id": "E", - "label": "ALA SUL", - "x": 0, - "z": -39, - "distSpawn": 5.83, + "label": "CANTEIRO SUL", + "x": -10, + "z": -14, + "distSpawn": 17.12, "timeSpawn": "E", - "maiorLinhaTiro": 88.2, - "chao": 0, - "penetracao": 0 + "maiorLinhaTiro": 59.9, + "chao": -1.58, + "penetracao": 1.017 }, { "id": "MID", - "label": "PÁTIO", - "x": 0, + "label": "A OBRA", + "x": 9, "z": 0, - "distSpawn": 42.3, + "distSpawn": 31.02, "timeSpawn": "E", - "maiorLinhaTiro": 55.9, - "chao": 0, - "penetracao": 0.018 + "maiorLinhaTiro": 48.1, + "chao": 0.1, + "penetracao": 0 }, { "id": "B", - "label": "ALA NORTE", - "x": 0, - "z": 39, - "distSpawn": 5.83, + "label": "CANTEIRO NORTE", + "x": -10, + "z": 14, + "distSpawn": 17.12, "timeSpawn": "B", - "maiorLinhaTiro": 88.4, - "chao": 0, + "maiorLinhaTiro": 59.1, + "chao": -0.79, "penetracao": 0 } ], - "alturaTrianguloMin": 0 + "alturaTrianguloMin": 19 }, { - "map": "treta_vietnan", - "celulasAlcancadas": 91060, - "amostrasChao": 5643, - "observadores": 1406, + "map": "atacadao_treta", + "celulasAlcancadas": 46509, + "amostrasChao": 3028, + "observadores": 767, "corpoDentroDeSolido": 0, "submersosAcimaDoPeito": 0, "piorPenetracao": 0, @@ -10058,57 +6890,57 @@ "spawns": [ { "team": "E", - "x": -12, - "z": -36.5, + "x": 6, + "z": -37, "chao": 0, - "penetracao": 0 + "penetracao": 0.01 }, { "team": "E", - "x": -4, - "z": -36.5, + "x": 14, + "z": -37, "chao": 0, - "penetracao": 0 + "penetracao": 0.01 }, { "team": "E", - "x": 4, - "z": -36.5, + "x": -6, + "z": -37, "chao": 0, - "penetracao": 0 + "penetracao": 0.01 }, { "team": "E", - "x": 12, - "z": -36.5, + "x": -14, + "z": -37, "chao": 0, - "penetracao": 0 + "penetracao": 0.01 }, { "team": "B", - "x": 12, - "z": 36.5, + "x": -8, + "z": 29, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": 4, - "z": 36.5, + "x": -2, + "z": 29, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": -4, - "z": 36.5, + "x": 4, + "z": 29, "chao": 0, "penetracao": 0 }, { "team": "B", - "x": -12, - "z": 36.5, + "x": 10, + "z": 29, "chao": 0, "penetracao": 0 } @@ -10118,456 +6950,449 @@ "team": "E", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.1664, - "maiorVisada": 91.2 + "fracMedia": 0.4588, + "maiorVisada": 70.5 }, { "team": "B", "chaoMin": 0, "chaoMax": 0, - "fracMedia": 0.1596, - "maiorVisada": 87.2 + "fracMedia": 0.078, + "maiorVisada": 68.5 } ], "exposicaoPorSpawn": [ { "team": "E", - "x": -12, - "z": -36.5, + "x": 6, + "z": -37, "chao": 0, - "obsLonge": 1157, - "obsVendo": 203, - "frac": 0.1755, - "maiorVisada": 82.1 + "obsLonge": 560, + "obsVendo": 253, + "frac": 0.4518, + "maiorVisada": 70.5 }, { "team": "E", - "x": -4, - "z": -36.5, + "x": 14, + "z": -37, "chao": 0, - "obsLonge": 1158, - "obsVendo": 149, - "frac": 0.1287, - "maiorVisada": 59.1 + "obsLonge": 594, + "obsVendo": 269, + "frac": 0.4529, + "maiorVisada": 68.2 }, { "team": "E", - "x": 4, - "z": -36.5, + "x": -6, + "z": -37, "chao": 0, - "obsLonge": 1158, - "obsVendo": 135, - "frac": 0.1166, - "maiorVisada": 58.1 + "obsLonge": 565, + "obsVendo": 263, + "frac": 0.4655, + "maiorVisada": 70.2 }, { "team": "E", - "x": 12, - "z": -36.5, + "x": -14, + "z": -37, "chao": 0, - "obsLonge": 1155, - "obsVendo": 283, - "frac": 0.245, - "maiorVisada": 91.2 + "obsLonge": 600, + "obsVendo": 279, + "frac": 0.465, + "maiorVisada": 68.1 }, { "team": "B", - "x": 12, - "z": 36.5, + "x": -8, + "z": 29, "chao": 0, - "obsLonge": 1147, - "obsVendo": 241, - "frac": 0.2101, - "maiorVisada": 87.2 + "obsLonge": 547, + "obsVendo": 9, + "frac": 0.0165, + "maiorVisada": 32.6 }, { "team": "B", - "x": 4, - "z": 36.5, + "x": -2, + "z": 29, "chao": 0, - "obsLonge": 1147, - "obsVendo": 132, - "frac": 0.1151, - "maiorVisada": 58.9 + "obsLonge": 526, + "obsVendo": 64, + "frac": 0.1217, + "maiorVisada": 68.5 }, { "team": "B", - "x": -4, - "z": 36.5, + "x": 4, + "z": 29, "chao": 0, - "obsLonge": 1150, - "obsVendo": 164, - "frac": 0.1426, - "maiorVisada": 66.1 + "obsLonge": 528, + "obsVendo": 11, + "frac": 0.0208, + "maiorVisada": 31.8 }, { "team": "B", - "x": -12, - "z": 36.5, + "x": 10, + "z": 29, "chao": 0, - "obsLonge": 1149, - "obsVendo": 196, - "frac": 0.1706, - "maiorVisada": 84.5 + "obsLonge": 556, + "obsVendo": 85, + "frac": 0.1529, + "maiorVisada": 68.5 } ], "salaDoSpawn": [ { "team": "E", - "x": -12, - "z": -36.5, - "folgaParede": 3.75, - "dirPior": 84, - "areaContigua": 62.6, + "x": 6, + "z": -37, + "folgaParede": 4.45, + "dirPior": 174, + "areaContigua": 68.1, "okFolga": true, "okArea": true }, { "team": "E", - "x": -4, - "z": -36.5, - "folgaParede": 2.5, - "dirPior": 158, - "areaContigua": 66.2, + "x": 14, + "z": -37, + "folgaParede": 4.75, + "dirPior": 276, + "areaContigua": 71.9, "okFolga": true, "okArea": true }, { "team": "E", - "x": 4, - "z": -36.5, - "folgaParede": 2.4, - "dirPior": 23, - "areaContigua": 59.1, + "x": -6, + "z": -37, + "folgaParede": 4.45, + "dirPior": 0, + "areaContigua": 68.6, "okFolga": true, "okArea": true }, { "team": "E", - "x": 12, - "z": -36.5, - "folgaParede": 2.8, - "dirPior": 309, - "areaContigua": 66.7, + "x": -14, + "z": -37, + "folgaParede": 4.75, + "dirPior": 264, + "areaContigua": 71.3, "okFolga": true, "okArea": true }, { "team": "B", - "x": 12, - "z": 36.5, - "folgaParede": 4.4, - "dirPior": 191, - "areaContigua": 68.3, + "x": -8, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 54.7, "okFolga": true, "okArea": true }, { "team": "B", - "x": 4, - "z": 36.5, - "folgaParede": 2.45, - "dirPior": 343, - "areaContigua": 59.1, + "x": -2, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 53.9, "okFolga": true, "okArea": true }, { "team": "B", - "x": -4, - "z": 36.5, - "folgaParede": 2.55, - "dirPior": 197, - "areaContigua": 66.2, + "x": 4, + "z": 29, + "folgaParede": 1.5, + "dirPior": 259, + "areaContigua": 52.1, "okFolga": true, "okArea": true }, { "team": "B", - "x": -12, - "z": 36.5, - "folgaParede": 2.85, - "dirPior": 129, - "areaContigua": 61.3, + "x": 10, + "z": 29, + "folgaParede": 2.2, + "dirPior": 225, + "areaContigua": 56.1, "okFolga": true, "okArea": true } ], - "piorFolga": 2.4, - "piorArea": 59.1, + "piorFolga": 1.5, + "piorArea": 52.1, "escadas": [], "travessia": [], "occluderSemMalha": [], - "occMedidos": 221, + "occMedidos": 65, "occPulados": 0, - "fracSemMalha": 0.0031, + "fracSemMalha": 0.0026, "quadrantes": [ { "q": "0,0", - "x0": -40.5, - "z0": -40.5, - "areaAndavel": 366, - "props": 8, - "waypoints": 44, - "densProp": 2.18, - "densWp": 12.02, - "espacamento": 6.77, - "razaoProp": 0.81, - "razaoWp": 1.11 + "x0": -25.5, + "z0": -41, + "areaAndavel": 179, + "props": 3, + "waypoints": 20, + "densProp": 1.68, + "densWp": 11.2, + "espacamento": 7.72, + "razaoProp": 0.44, + "razaoWp": 1.12 }, { "q": "0,1", - "x0": -40.5, - "z0": -20.3, - "areaAndavel": 350, - "props": 10, - "waypoints": 36, - "densProp": 2.86, - "densWp": 10.29, - "espacamento": 5.91, - "razaoProp": 1.06, - "razaoWp": 0.95 + "x0": -25.5, + "z0": -22.8, + "areaAndavel": 162, + "props": 5, + "waypoints": 20, + "densProp": 3.09, + "densWp": 12.35, + "espacamento": 5.69, + "razaoProp": 0.8, + "razaoWp": 1.23 }, { "q": "0,2", - "x0": -40.5, - "z0": 0, - "areaAndavel": 352, - "props": 10, - "waypoints": 45, - "densProp": 2.84, - "densWp": 12.77, - "espacamento": 5.94, - "razaoProp": 1.05, - "razaoWp": 1.18 + "x0": -25.5, + "z0": -4.5, + "areaAndavel": 198, + "props": 7, + "waypoints": 17, + "densProp": 3.54, + "densWp": 8.61, + "espacamento": 5.31, + "razaoProp": 0.92, + "razaoWp": 0.86 }, { "q": "0,3", - "x0": -40.5, - "z0": 20.3, - "areaAndavel": 359, - "props": 8, - "waypoints": 44, - "densProp": 2.23, - "densWp": 12.27, - "espacamento": 6.7, - "razaoProp": 0.83, - "razaoWp": 1.13 + "x0": -25.5, + "z0": 13.8, + "areaAndavel": 176, + "props": 12, + "waypoints": 19, + "densProp": 6.82, + "densWp": 10.79, + "espacamento": 3.83, + "razaoProp": 1.77, + "razaoWp": 1.08 }, { "q": "1,0", - "x0": -20.3, - "z0": -40.5, - "areaAndavel": 347, - "props": 10, - "waypoints": 31, - "densProp": 2.88, - "densWp": 8.94, - "espacamento": 5.89, - "razaoProp": 1.07, - "razaoWp": 0.82 + "x0": -12.8, + "z0": -41, + "areaAndavel": 178, + "props": 2, + "waypoints": 17, + "densProp": 1.12, + "densWp": 9.53, + "espacamento": 9.44, + "razaoProp": 0.29, + "razaoWp": 0.95 }, { "q": "1,1", - "x0": -20.3, - "z0": -20.3, - "areaAndavel": 361, - "props": 8, - "waypoints": 28, - "densProp": 2.22, - "densWp": 7.76, - "espacamento": 6.71, - "razaoProp": 0.82, - "razaoWp": 0.71 + "x0": -12.8, + "z0": -22.8, + "areaAndavel": 180, + "props": 5, + "waypoints": 19, + "densProp": 2.77, + "densWp": 10.54, + "espacamento": 6, + "razaoProp": 0.72, + "razaoWp": 1.05 }, { "q": "1,2", - "x0": -20.3, - "z0": 0, - "areaAndavel": 352, - "props": 9, - "waypoints": 33, - "densProp": 2.56, - "densWp": 9.37, - "espacamento": 6.26, - "razaoProp": 0.95, - "razaoWp": 0.86 + "x0": -12.8, + "z0": -4.5, + "areaAndavel": 190, + "props": 15, + "waypoints": 15, + "densProp": 7.88, + "densWp": 7.88, + "espacamento": 3.56, + "razaoProp": 2.05, + "razaoWp": 0.79 }, { "q": "1,3", - "x0": -20.3, - "z0": 20.3, - "areaAndavel": 349, - "props": 10, - "waypoints": 32, - "densProp": 2.87, - "densWp": 9.17, - "espacamento": 5.91, - "razaoProp": 1.06, - "razaoWp": 0.84 + "x0": -12.8, + "z0": 13.8, + "areaAndavel": 191, + "props": 18, + "waypoints": 15, + "densProp": 9.4, + "densWp": 7.84, + "espacamento": 3.26, + "razaoProp": 2.44, + "razaoWp": 0.78 }, { "q": "2,0", "x0": 0, - "z0": -40.5, - "areaAndavel": 345, - "props": 10, - "waypoints": 42, - "densProp": 2.9, - "densWp": 12.18, - "espacamento": 5.87, - "razaoProp": 1.08, - "razaoWp": 1.12 + "z0": -41, + "areaAndavel": 162, + "props": 4, + "waypoints": 15, + "densProp": 2.47, + "densWp": 9.27, + "espacamento": 6.36, + "razaoProp": 0.64, + "razaoWp": 0.92 }, { "q": "2,1", "x0": 0, - "z0": -20.3, - "areaAndavel": 366, - "props": 8, - "waypoints": 35, - "densProp": 2.19, - "densWp": 9.57, - "espacamento": 6.76, - "razaoProp": 0.81, - "razaoWp": 0.88 + "z0": -22.8, + "areaAndavel": 161, + "props": 7, + "waypoints": 18, + "densProp": 4.35, + "densWp": 11.18, + "espacamento": 4.79, + "razaoProp": 1.13, + "razaoWp": 1.11 }, { "q": "2,2", "x0": 0, - "z0": 0, - "areaAndavel": 358, - "props": 8, - "waypoints": 38, - "densProp": 2.24, - "densWp": 10.62, - "espacamento": 6.69, - "razaoProp": 0.83, - "razaoWp": 0.98 + "z0": -4.5, + "areaAndavel": 189, + "props": 16, + "waypoints": 15, + "densProp": 8.46, + "densWp": 7.93, + "espacamento": 3.44, + "razaoProp": 2.2, + "razaoWp": 0.79 }, { "q": "2,3", "x0": 0, - "z0": 20.3, - "areaAndavel": 352, - "props": 10, - "waypoints": 39, - "densProp": 2.84, - "densWp": 11.09, - "espacamento": 5.93, - "razaoProp": 1.05, - "razaoWp": 1.02 + "z0": 13.8, + "areaAndavel": 191, + "props": 18, + "waypoints": 15, + "densProp": 9.4, + "densWp": 7.84, + "espacamento": 3.26, + "razaoProp": 2.44, + "razaoWp": 0.78 }, { "q": "3,0", - "x0": 20.3, - "z0": -40.5, - "areaAndavel": 358, - "props": 8, - "waypoints": 44, - "densProp": 2.23, - "densWp": 12.28, - "espacamento": 6.69, - "razaoProp": 0.83, - "razaoWp": 1.13 + "x0": 12.8, + "z0": -41, + "areaAndavel": 197, + "props": 1, + "waypoints": 22, + "densProp": 0.51, + "densWp": 11.15, + "espacamento": 14.05, + "razaoProp": 0.13, + "razaoWp": 1.11 }, { "q": "3,1", - "x0": 20.3, - "z0": -20.3, - "areaAndavel": 353, - "props": 10, - "waypoints": 34, - "densProp": 2.83, - "densWp": 9.63, - "espacamento": 5.94, - "razaoProp": 1.05, - "razaoWp": 0.89 + "x0": 12.8, + "z0": -22.8, + "areaAndavel": 185, + "props": 3, + "waypoints": 22, + "densProp": 1.62, + "densWp": 11.91, + "espacamento": 7.85, + "razaoProp": 0.42, + "razaoWp": 1.19 }, { "q": "3,2", - "x0": 20.3, - "z0": 0, - "areaAndavel": 351, - "props": 10, - "waypoints": 44, - "densProp": 2.85, - "densWp": 12.54, - "espacamento": 5.92, - "razaoProp": 1.06, - "razaoWp": 1.16 + "x0": 12.8, + "z0": -4.5, + "areaAndavel": 193, + "props": 8, + "waypoints": 15, + "densProp": 4.15, + "densWp": 7.79, + "espacamento": 4.91, + "razaoProp": 1.08, + "razaoWp": 0.78 }, { "q": "3,3", - "x0": 20.3, - "z0": 20.3, - "areaAndavel": 373, - "props": 8, - "waypoints": 44, - "densProp": 2.14, - "densWp": 11.79, - "espacamento": 6.83, - "razaoProp": 0.79, + "x0": 12.8, + "z0": 13.8, + "areaAndavel": 174, + "props": 13, + "waypoints": 19, + "densProp": 7.46, + "densWp": 10.9, + "espacamento": 3.66, + "razaoProp": 1.94, "razaoWp": 1.09 } ], - "medianaProp": 2.6950000000000003, - "medianaWp": 10.855, - "piorRazaoProp": 0.79, - "piorRazaoWp": 0.71, - "piorEspacamento": 6.83, + "medianaProp": 3.845, + "medianaWp": 10.035, + "piorRazaoProp": 0.13, + "piorRazaoWp": 0.78, + "piorEspacamento": 14.05, "rotasSpawnBandeira": [ { "time": "E", "bandeira": "E", - "rotas": 4, + "rotas": 2, "comprimentos": [ - 11.5, - 11.5, - 11.5, - 11.5 + 22.4, + 53.3 ] }, { "time": "E", "bandeira": "MID", - "rotas": 3, + "rotas": 2, "comprimentos": [ - 51.4, - 54.9, - 77.2 + 33.3, + 37.9 ] }, { "time": "E", "bandeira": "B", - "rotas": 3, + "rotas": 2, "comprimentos": [ - 83.9, - 92.4, - 106.2 + 70.6, + 87.2 ] }, { "time": "B", "bandeira": "E", - "rotas": 4, + "rotas": 2, "comprimentos": [ - 77.2, - 91.7, - 95.9, - 137.6 + 60.3, + 86.6 ] }, { "time": "B", "bandeira": "MID", - "rotas": 4, + "rotas": 3, "comprimentos": [ - 44, - 48.2, - 72.9, - 78.9 + 55.7, + 56.5, + 90.1 ] }, { @@ -10575,50 +7400,50 @@ "bandeira": "B", "rotas": 4, "comprimentos": [ - 11.5, - 11.5, - 11.5, - 11.5 + 9.1, + 9.1, + 9.1, + 9.1 ] } ], - "piorRotas": 3, + "piorRotas": 2, "bandeiras": [ { "id": "E", - "label": "TRILHA SUL", - "x": -14, - "z": -29, - "distSpawn": 7.76, + "label": "ESTACIONAMENTO", + "x": -8, + "z": -30, + "distSpawn": 7.28, "timeSpawn": "E", - "maiorLinhaTiro": 86.9, + "maiorLinhaTiro": 62.9, "chao": 0, - "penetracao": 0 + "penetracao": 0.01 }, { "id": "MID", - "label": "VILAREJO", - "x": 8, - "z": 0, - "distSpawn": 36.72, + "label": "PORTA", + "x": 10, + "z": -8, + "distSpawn": 29.27, "timeSpawn": "E", - "maiorLinhaTiro": 56.6, + "maiorLinhaTiro": 45.6, "chao": 0, "penetracao": 0 }, { "id": "B", - "label": "TRILHA NORTE", - "x": 14, - "z": 29, - "distSpawn": 7.76, + "label": "DOCA", + "x": -8, + "z": 24, + "distSpawn": 5, "timeSpawn": "B", - "maiorLinhaTiro": 84.3, + "maiorLinhaTiro": 64.4, "chao": 0, "penetracao": 0 } ], - "alturaTrianguloMin": 7.2 + "alturaTrianguloMin": 18 } ] } \ No newline at end of file diff --git a/tools/eval/pickup_check.json b/tools/eval/pickup_check.json index d97ca92fe..89d0032d3 100644 --- a/tools/eval/pickup_check.json +++ b/tools/eval/pickup_check.json @@ -1,5 +1,5 @@ { - "gerado": "2026-08-19T01:42:58.834Z", + "gerado": "2026-08-15T02:16:34.847Z", "criterios": { "chaoMinimoM": -0.1, "vaoMaximoM": 0.05, @@ -9,7 +9,7 @@ "reta": "reta andável de um spawn do time" } }, - "totalPickups": 842, + "totalPickups": 506, "semAlcance": 0, "abaixoDoPiso": 0, "flutuando": 0, @@ -7229,31 +7229,31 @@ ] }, { - "map": "upa_24h", - "waypoints": 404, + "map": "obras_prefeitura", + "waypoints": 314, "pickups": 66, - "spawnPiorDistWaypoint": 1.34, - "celulasAlcancadas": 54212, + "spawnPiorDistWaypoint": 2, + "celulasAlcancadas": 54416, "semAlcance": 0, "semAlcanceWpVelho": 0, - "semAlcanceRetaVelho": 4, + "semAlcanceRetaVelho": 0, "piorDistAndavel": 0.16, "abaixoDoPiso": 0, "flutuando": 0, - "piorDistWaypoint": 2.18, - "piorChao": 0, + "piorDistWaypoint": 2.21, + "piorChao": -0.077, "piorVao": 0.01, "itens": [ { "arma": "awp", "fonte": "mapa", - "x": -25, - "z": -34, - "chao": 0, - "distWaypoint": 0.2, - "yOrigem": -0.01, + "x": -9, + "z": -30, + "chao": -0.062, + "distWaypoint": 1.02, + "yOrigem": -0.072, "vaoOrigem": -0.01, - "baseMesh": 0.01, + "baseMesh": -0.052, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7266,13 +7266,13 @@ { "arma": "ak", "fonte": "mapa", - "x": -22, - "z": -34, - "chao": 0, - "distWaypoint": 0.4, - "yOrigem": 0.15, + "x": -6, + "z": -30, + "chao": -0.063, + "distWaypoint": 0.82, + "yOrigem": 0.087, "vaoOrigem": 0.15, - "baseMesh": 0.01, + "baseMesh": -0.053, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7285,13 +7285,13 @@ { "arma": "m4", "fonte": "mapa", - "x": -19, - "z": -34, - "chao": 0, - "distWaypoint": 0.6, - "yOrigem": 0.11, + "x": -3, + "z": -30, + "chao": -0.046, + "distWaypoint": 0.63, + "yOrigem": 0.064, "vaoOrigem": 0.11, - "baseMesh": 0.01, + "baseMesh": -0.036, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7304,13 +7304,13 @@ { "arma": "shotgun", "fonte": "mapa", - "x": -16, - "z": -34, - "chao": 0, - "distWaypoint": 0.8, - "yOrigem": 0.035, + "x": 0, + "z": -30, + "chao": -0.017, + "distWaypoint": 0.45, + "yOrigem": 0.018, "vaoOrigem": 0.035, - "baseMesh": 0.01, + "baseMesh": -0.007, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7323,13 +7323,13 @@ { "arma": "mp5", "fonte": "mapa", - "x": -13, - "z": -34, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.12, + "x": 3, + "z": -30, + "chao": 0.013, + "distWaypoint": 0.28, + "yOrigem": 0.133, "vaoOrigem": 0.12, - "baseMesh": 0.01, + "baseMesh": 0.023, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7342,13 +7342,13 @@ { "arma": "deagle", "fonte": "mapa", - "x": -10, - "z": -34, - "chao": 0, - "distWaypoint": 1.2, - "yOrigem": 0.09, + "x": 6, + "z": -30, + "chao": 0.035, + "distWaypoint": 0.2, + "yOrigem": 0.125, "vaoOrigem": 0.09, - "baseMesh": 0.01, + "baseMesh": 0.045, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7361,13 +7361,13 @@ { "arma": "pistol", "fonte": "mapa", - "x": -7, - "z": -34, - "chao": 0, - "distWaypoint": 1.4, - "yOrigem": 0.06, + "x": 9, + "z": -30, + "chao": 0.042, + "distWaypoint": 0.28, + "yOrigem": 0.102, "vaoOrigem": 0.06, - "baseMesh": 0.01, + "baseMesh": 0.052, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7380,13 +7380,13 @@ { "arma": "awp", "fonte": "mapa", - "x": 25, - "z": 34, - "chao": 0, - "distWaypoint": 0.82, - "yOrigem": -0.01, + "x": -9, + "z": 30, + "chao": -0.077, + "distWaypoint": 1.41, + "yOrigem": -0.087, "vaoOrigem": -0.01, - "baseMesh": 0.01, + "baseMesh": -0.067, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7399,13 +7399,13 @@ { "arma": "ak", "fonte": "mapa", - "x": 22, - "z": 34, - "chao": 0, - "distWaypoint": 0.89, - "yOrigem": 0.15, + "x": -6, + "z": 30, + "chao": -0.07, + "distWaypoint": 1.28, + "yOrigem": 0.08, "vaoOrigem": 0.15, - "baseMesh": 0.01, + "baseMesh": -0.06, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7418,13 +7418,13 @@ { "arma": "m4", "fonte": "mapa", - "x": 19, - "z": 34, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.11, + "x": -3, + "z": 30, + "chao": -0.048, + "distWaypoint": 1.17, + "yOrigem": 0.062, "vaoOrigem": 0.11, - "baseMesh": 0.01, + "baseMesh": -0.038, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7437,13 +7437,13 @@ { "arma": "shotgun", "fonte": "mapa", - "x": 16, - "z": 34, - "chao": 0, - "distWaypoint": 1.13, - "yOrigem": 0.035, + "x": 0, + "z": 30, + "chao": -0.018, + "distWaypoint": 1.08, + "yOrigem": 0.017, "vaoOrigem": 0.035, - "baseMesh": 0.01, + "baseMesh": -0.008, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7456,13 +7456,13 @@ { "arma": "mp5", "fonte": "mapa", - "x": 13, - "z": 34, - "chao": 0, - "distWaypoint": 1.28, - "yOrigem": 0.12, + "x": 3, + "z": 30, + "chao": 0.011, + "distWaypoint": 1.02, + "yOrigem": 0.131, "vaoOrigem": 0.12, - "baseMesh": 0.01, + "baseMesh": 0.021, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7475,13 +7475,13 @@ { "arma": "deagle", "fonte": "mapa", - "x": 10, - "z": 34, - "chao": 0, - "distWaypoint": 1.44, - "yOrigem": 0.09, + "x": 6, + "z": 30, + "chao": 0.028, + "distWaypoint": 1, + "yOrigem": 0.118, "vaoOrigem": 0.09, - "baseMesh": 0.01, + "baseMesh": 0.038, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7494,13 +7494,13 @@ { "arma": "pistol", "fonte": "mapa", - "x": 7, - "z": 34, - "chao": 0, - "distWaypoint": 1.61, - "yOrigem": 0.06, + "x": 9, + "z": 30, + "chao": 0.027, + "distWaypoint": 1.02, + "yOrigem": 0.087, "vaoOrigem": 0.06, - "baseMesh": 0.01, + "baseMesh": 0.037, "vao": 0.01, "distAndavel": 0, "retaDoSpawn": true, @@ -7513,18 +7513,18 @@ { "arma": "ak", "fonte": "mapa", - "x": -1.6, - "z": 3, - "chao": 0, - "distWaypoint": 1.34, - "yOrigem": 0.15, + "x": -4, + "z": 0, + "chao": 0.037, + "distWaypoint": 1.08, + "yOrigem": 0.187, "vaoOrigem": 0.15, - "baseMesh": 0.01, + "baseMesh": 0.047, "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": false, + "distAndavel": 0, + "retaDoSpawn": true, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, + "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -7532,18 +7532,18 @@ { "arma": "m4", "fonte": "mapa", - "x": 1.6, - "z": -3, - "chao": 0, - "distWaypoint": 1.22, - "yOrigem": 0.11, + "x": 4, + "z": 0, + "chao": 0.541, + "distWaypoint": 1.56, + "yOrigem": 0.651, "vaoOrigem": 0.11, - "baseMesh": 0.01, + "baseMesh": 0.551, "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": false, + "distAndavel": 0, + "retaDoSpawn": true, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, + "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -7551,15 +7551,15 @@ { "arma": "awp", "fonte": "rack", - "x": -28.5, - "z": -32.32, + "x": -2.9, + "z": -32.6, "chao": 0, - "distWaypoint": 1.23, + "distWaypoint": 0.81, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.07, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7570,15 +7570,15 @@ { "arma": "mosin", "fonte": "rack", - "x": -28.5, - "z": -32.32, + "x": -1.75, + "z": -32.6, "chao": 0, - "distWaypoint": 1.23, + "distWaypoint": 1.41, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.07, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7589,15 +7589,15 @@ { "arma": "rem700", "fonte": "rack", - "x": -27.87, - "z": -32.25, + "x": -0.6, + "z": -32.6, "chao": 0, - "distWaypoint": 1.06, + "distWaypoint": 0.45, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.12, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7608,15 +7608,15 @@ { "arma": "m400", "fonte": "rack", - "x": -27.28, - "z": -32.59, + "x": 0.55, + "z": -32.6, "chao": 0, - "distWaypoint": 1.57, + "distWaypoint": 1.03, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.11, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7627,15 +7627,15 @@ { "arma": "svd", "fonte": "rack", - "x": -26.15, + "x": 1.7, "z": -32.6, "chao": 0, - "distWaypoint": 1.69, + "distWaypoint": 1.17, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.11, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7646,15 +7646,15 @@ { "arma": "g3sg1", "fonte": "rack", - "x": -25, + "x": 2.85, "z": -32.6, "chao": 0, - "distWaypoint": 1.41, + "distWaypoint": 0.4, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7665,15 +7665,15 @@ { "arma": "sks", "fonte": "rack", - "x": -23.85, + "x": 4, "z": -32.6, "chao": 0, - "distWaypoint": 1.94, + "distWaypoint": 1.26, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7684,15 +7684,15 @@ { "arma": "ak", "fonte": "rack", - "x": -22.7, + "x": 5.15, "z": -32.6, "chao": 0, - "distWaypoint": 1.43, + "distWaypoint": 0.94, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7703,10 +7703,10 @@ { "arma": "akm", "fonte": "rack", - "x": -21.55, + "x": 6.3, "z": -32.6, "chao": 0, - "distWaypoint": 1.64, + "distWaypoint": 0.5, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -7722,15 +7722,15 @@ { "arma": "m4", "fonte": "rack", - "x": -20.4, + "x": 7.45, "z": -32.6, "chao": 0, - "distWaypoint": 1.61, + "distWaypoint": 1.5, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.11, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7741,15 +7741,15 @@ { "arma": "md97", "fonte": "rack", - "x": -19.25, + "x": 8.6, "z": -32.6, "chao": 0, - "distWaypoint": 1.44, + "distWaypoint": 0.72, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7760,15 +7760,15 @@ { "arma": "g3", "fonte": "rack", - "x": -18.1, + "x": 9.75, "z": -32.6, "chao": 0, - "distWaypoint": 1.91, + "distWaypoint": 0.68, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7779,15 +7779,15 @@ { "arma": "scar", "fonte": "rack", - "x": -16.95, + "x": 10.9, "z": -32.6, "chao": 0, - "distWaypoint": 1.41, + "distWaypoint": 1.55, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.14, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7798,15 +7798,15 @@ { "arma": "carbine", "fonte": "rack", - "x": -28.5, + "x": -2.32, "z": -29.4, - "chao": 0, - "distWaypoint": 1.12, - "yOrigem": 0.042, + "chao": -0.065, + "distWaypoint": 1.34, + "yOrigem": -0.023, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.055, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7817,15 +7817,15 @@ { "arma": "m92", "fonte": "rack", - "x": -27.88, + "x": -1.17, "z": -29.4, - "chao": 0, - "distWaypoint": 1.01, - "yOrigem": 0.042, + "chao": -0.051, + "distWaypoint": 0.87, + "yOrigem": -0.009, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.041, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7836,13 +7836,13 @@ { "arma": "tavor", "fonte": "rack", - "x": -26.72, + "x": -0.02, "z": -29.4, - "chao": 0, - "distWaypoint": 1.62, - "yOrigem": 0.042, + "chao": -0.036, + "distWaypoint": 0.55, + "yOrigem": 0.006, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.026, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, @@ -7855,15 +7855,15 @@ { "arma": "famas", "fonte": "rack", - "x": -25.57, + "x": 1.13, "z": -29.4, - "chao": 0, - "distWaypoint": 1.07, - "yOrigem": 0.042, + "chao": -0.02, + "distWaypoint": 1.58, + "yOrigem": 0.022, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7874,15 +7874,15 @@ { "arma": "p90", "fonte": "rack", - "x": -24.43, + "x": 2.28, "z": -29.4, - "chao": 0, - "distWaypoint": 1.27, - "yOrigem": 0.042, + "chao": -0.005, + "distWaypoint": 0.66, + "yOrigem": 0.037, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.005, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7893,15 +7893,15 @@ { "arma": "mp5", "fonte": "rack", - "x": -23.27, + "x": 3.43, "z": -29.4, - "chao": 0, - "distWaypoint": 1.33, - "yOrigem": 0.042, + "chao": 0.01, + "distWaypoint": 0.74, + "yOrigem": 0.052, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.02, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7912,15 +7912,15 @@ { "arma": "uzi", "fonte": "rack", - "x": -22.13, + "x": 4.58, "z": -29.4, - "chao": 0, - "distWaypoint": 1.04, - "yOrigem": 0.042, + "chao": 0.022, + "distWaypoint": 1.48, + "yOrigem": 0.064, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.032, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7931,13 +7931,13 @@ { "arma": "shotgun", "fonte": "rack", - "x": -20.97, + "x": 5.72, "z": -29.4, - "chao": 0, - "distWaypoint": 1.7, - "yOrigem": 0.042, + "chao": 0.032, + "distWaypoint": 0.49, + "yOrigem": 0.074, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.042, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, @@ -7950,15 +7950,15 @@ { "arma": "lmg", "fonte": "rack", - "x": -19.82, + "x": 6.88, "z": -29.4, - "chao": 0, - "distWaypoint": 1.03, - "yOrigem": 0.042, + "chao": 0.039, + "distWaypoint": 0.96, + "yOrigem": 0.081, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.049, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7969,15 +7969,15 @@ { "arma": "deagle", "fonte": "rack", - "x": -18.68, + "x": 8.03, "z": -29.4, - "chao": 0, - "distWaypoint": 1.36, - "yOrigem": 0.042, + "chao": 0.043, + "distWaypoint": 1.24, + "yOrigem": 0.085, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.053, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -7988,15 +7988,15 @@ { "arma": "revolver38", "fonte": "rack", - "x": -17.52, + "x": 9.18, "z": -29.4, - "chao": 0, - "distWaypoint": 1.24, - "yOrigem": 0.042, + "chao": 0.043, + "distWaypoint": 0.4, + "yOrigem": 0.085, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.053, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -8007,15 +8007,15 @@ { "arma": "pistol", "fonte": "rack", - "x": -16.38, + "x": 10.32, "z": -29.4, - "chao": 0, - "distWaypoint": 1.09, - "yOrigem": 0.042, + "chao": 0.04, + "distWaypoint": 1.19, + "yOrigem": 0.082, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.05, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -8026,18 +8026,18 @@ { "arma": "awp", "fonte": "rack", - "x": 2.85, + "x": -2.9, "z": 32.6, "chao": 0, - "distWaypoint": 0.6, + "distWaypoint": 1.75, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0.14, - "retaDoSpawn": false, + "retaDoSpawn": true, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, + "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -8045,10 +8045,10 @@ { "arma": "mosin", "fonte": "rack", - "x": 4.25, + "x": -1.75, "z": 32.6, "chao": 0, - "distWaypoint": 1.57, + "distWaypoint": 2.09, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8064,18 +8064,18 @@ { "arma": "rem700", "fonte": "rack", - "x": 5.29, - "z": 32.55, + "x": -0.6, + "z": 32.6, "chao": 0, - "distWaypoint": 2.18, + "distWaypoint": 1.61, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, + "distAndavel": 0.14, + "retaDoSpawn": true, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, + "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -8083,15 +8083,15 @@ { "arma": "m400", "fonte": "rack", - "x": 6.7, - "z": 32.53, + "x": 0.55, + "z": 32.6, "chao": 0, - "distWaypoint": 1.83, + "distWaypoint": 1.86, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.06, + "distAndavel": 0.11, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -8102,10 +8102,10 @@ { "arma": "svd", "fonte": "rack", - "x": 7.7, + "x": 1.7, "z": 32.6, "chao": 0, - "distWaypoint": 0.92, + "distWaypoint": 1.94, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8121,10 +8121,10 @@ { "arma": "g3sg1", "fonte": "rack", - "x": 8.85, + "x": 2.85, "z": 32.6, "chao": 0, - "distWaypoint": 0.75, + "distWaypoint": 1.6, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8140,10 +8140,10 @@ { "arma": "sks", "fonte": "rack", - "x": 10, + "x": 4, "z": 32.6, "chao": 0, - "distWaypoint": 1.34, + "distWaypoint": 2, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8159,10 +8159,10 @@ { "arma": "ak", "fonte": "rack", - "x": 11.15, + "x": 5.15, "z": 32.6, "chao": 0, - "distWaypoint": 0.6, + "distWaypoint": 1.81, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8178,10 +8178,10 @@ { "arma": "akm", "fonte": "rack", - "x": 12.3, + "x": 6.3, "z": 32.6, "chao": 0, - "distWaypoint": 1.25, + "distWaypoint": 1.63, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8197,10 +8197,10 @@ { "arma": "m4", "fonte": "rack", - "x": 13.45, + "x": 7.45, "z": 32.6, "chao": 0, - "distWaypoint": 0.81, + "distWaypoint": 2.16, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8216,10 +8216,10 @@ { "arma": "md97", "fonte": "rack", - "x": 14.6, + "x": 8.6, "z": 32.6, "chao": 0, - "distWaypoint": 0.85, + "distWaypoint": 1.71, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8235,10 +8235,10 @@ { "arma": "g3", "fonte": "rack", - "x": 15.75, + "x": 9.75, "z": 32.6, "chao": 0, - "distWaypoint": 1.21, + "distWaypoint": 1.69, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8254,10 +8254,10 @@ { "arma": "scar", "fonte": "rack", - "x": 16.9, + "x": 10.9, "z": 32.6, "chao": 0, - "distWaypoint": 0.61, + "distWaypoint": 2.19, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -8273,15 +8273,15 @@ { "arma": "carbine", "fonte": "rack", - "x": 4.15, + "x": -2.32, "z": 29.4, - "chao": 0, - "distWaypoint": 1.68, - "yOrigem": 0.042, + "chao": -0.06, + "distWaypoint": 2.05, + "yOrigem": -0.018, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.05, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -8292,13 +8292,13 @@ { "arma": "m92", "fonte": "rack", - "x": 4.83, + "x": -1.17, "z": 29.4, - "chao": 0, - "distWaypoint": 1.27, - "yOrigem": 0.042, + "chao": -0.045, + "distWaypoint": 1.78, + "yOrigem": -0.003, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.035, "vao": 0.01, "distAndavel": 0.13, "retaDoSpawn": true, @@ -8311,13 +8311,13 @@ { "arma": "tavor", "fonte": "rack", - "x": 5.98, + "x": -0.02, "z": 29.4, - "chao": 0, - "distWaypoint": 1.07, - "yOrigem": 0.042, + "chao": -0.029, + "distWaypoint": 1.64, + "yOrigem": 0.013, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.019, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, @@ -8330,13 +8330,13 @@ { "arma": "famas", "fonte": "rack", - "x": 7.13, + "x": 1.13, "z": 29.4, - "chao": 0, - "distWaypoint": 1.62, - "yOrigem": 0.042, + "chao": -0.014, + "distWaypoint": 2.21, + "yOrigem": 0.028, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": -0.004, "vao": 0.01, "distAndavel": 0.16, "retaDoSpawn": true, @@ -8349,13 +8349,13 @@ { "arma": "p90", "fonte": "rack", - "x": 8.28, + "x": 2.28, "z": 29.4, - "chao": 0, - "distWaypoint": 1.01, - "yOrigem": 0.042, + "chao": 0.001, + "distWaypoint": 1.68, + "yOrigem": 0.043, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.011, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, @@ -8368,13 +8368,13 @@ { "arma": "mp5", "fonte": "rack", - "x": 9.43, + "x": 3.43, "z": 29.4, - "chao": 0, - "distWaypoint": 1.43, - "yOrigem": 0.042, + "chao": 0.013, + "distWaypoint": 1.72, + "yOrigem": 0.055, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.023, "vao": 0.01, "distAndavel": 0.13, "retaDoSpawn": true, @@ -8387,13 +8387,13 @@ { "arma": "uzi", "fonte": "rack", - "x": 10.57, + "x": 4.58, "z": 29.4, - "chao": 0, - "distWaypoint": 1.18, - "yOrigem": 0.042, + "chao": 0.023, + "distWaypoint": 2.14, + "yOrigem": 0.065, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.033, "vao": 0.01, "distAndavel": 0.13, "retaDoSpawn": true, @@ -8406,13 +8406,13 @@ { "arma": "shotgun", "fonte": "rack", - "x": 11.72, + "x": 5.72, "z": 29.4, - "chao": 0, - "distWaypoint": 1.13, - "yOrigem": 0.042, + "chao": 0.03, + "distWaypoint": 1.62, + "yOrigem": 0.072, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.04, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, @@ -8425,13 +8425,13 @@ { "arma": "lmg", "fonte": "rack", - "x": 12.88, + "x": 6.88, "z": 29.4, - "chao": 0, - "distWaypoint": 1.51, - "yOrigem": 0.042, + "chao": 0.034, + "distWaypoint": 1.82, + "yOrigem": 0.076, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.044, "vao": 0.01, "distAndavel": 0.16, "retaDoSpawn": true, @@ -8444,6413 +8444,15 @@ { "arma": "deagle", "fonte": "rack", - "x": 14.03, - "z": 29.4, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": 15.18, - "z": 29.4, - "chao": 0, - "distWaypoint": 1.54, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": 16.32, - "z": 29.4, - "chao": 0, - "distWaypoint": 1.11, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - } - ] - }, - { - "map": "obras_prefeitura", - "waypoints": 314, - "pickups": 66, - "spawnPiorDistWaypoint": 2, - "celulasAlcancadas": 54416, - "semAlcance": 0, - "semAlcanceWpVelho": 0, - "semAlcanceRetaVelho": 0, - "piorDistAndavel": 0.16, - "abaixoDoPiso": 0, - "flutuando": 0, - "piorDistWaypoint": 2.21, - "piorChao": -0.077, - "piorVao": 0.01, - "itens": [ - { - "arma": "awp", - "fonte": "mapa", - "x": -9, - "z": -30, - "chao": -0.062, - "distWaypoint": 1.02, - "yOrigem": -0.072, - "vaoOrigem": -0.01, - "baseMesh": -0.052, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -6, - "z": -30, - "chao": -0.063, - "distWaypoint": 0.82, - "yOrigem": 0.087, - "vaoOrigem": 0.15, - "baseMesh": -0.053, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -3, - "z": -30, - "chao": -0.046, - "distWaypoint": 0.63, - "yOrigem": 0.064, - "vaoOrigem": 0.11, - "baseMesh": -0.036, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": -30, - "chao": -0.017, - "distWaypoint": 0.45, - "yOrigem": 0.018, - "vaoOrigem": 0.035, - "baseMesh": -0.007, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 3, - "z": -30, - "chao": 0.013, - "distWaypoint": 0.28, - "yOrigem": 0.133, - "vaoOrigem": 0.12, - "baseMesh": 0.023, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 6, - "z": -30, - "chao": 0.035, - "distWaypoint": 0.2, - "yOrigem": 0.125, - "vaoOrigem": 0.09, - "baseMesh": 0.045, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 9, - "z": -30, - "chao": 0.042, - "distWaypoint": 0.28, - "yOrigem": 0.102, - "vaoOrigem": 0.06, - "baseMesh": 0.052, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "mapa", - "x": -9, - "z": 30, - "chao": -0.077, - "distWaypoint": 1.41, - "yOrigem": -0.087, - "vaoOrigem": -0.01, - "baseMesh": -0.067, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -6, - "z": 30, - "chao": -0.07, - "distWaypoint": 1.28, - "yOrigem": 0.08, - "vaoOrigem": 0.15, - "baseMesh": -0.06, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -3, - "z": 30, - "chao": -0.048, - "distWaypoint": 1.17, - "yOrigem": 0.062, - "vaoOrigem": 0.11, - "baseMesh": -0.038, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": 30, - "chao": -0.018, - "distWaypoint": 1.08, - "yOrigem": 0.017, - "vaoOrigem": 0.035, - "baseMesh": -0.008, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 3, - "z": 30, - "chao": 0.011, - "distWaypoint": 1.02, - "yOrigem": 0.131, - "vaoOrigem": 0.12, - "baseMesh": 0.021, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 6, - "z": 30, - "chao": 0.028, - "distWaypoint": 1, - "yOrigem": 0.118, - "vaoOrigem": 0.09, - "baseMesh": 0.038, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 9, - "z": 30, - "chao": 0.027, - "distWaypoint": 1.02, - "yOrigem": 0.087, - "vaoOrigem": 0.06, - "baseMesh": 0.037, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -4, - "z": 0, - "chao": 0.037, - "distWaypoint": 1.08, - "yOrigem": 0.187, - "vaoOrigem": 0.15, - "baseMesh": 0.047, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": 4, - "z": 0, - "chao": 0.541, - "distWaypoint": 1.56, - "yOrigem": 0.651, - "vaoOrigem": 0.11, - "baseMesh": 0.551, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -2.9, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -1.75, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -0.6, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.45, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": 0.55, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.03, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": 1.7, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.17, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": 2.85, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.4, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": 4, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.26, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": 5.15, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.94, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": 6.3, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": 7.45, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": 8.6, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.72, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": 9.75, - "z": -32.6, - "chao": 0, - "distWaypoint": 0.68, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": 10.9, - "z": -32.6, - "chao": 0, - "distWaypoint": 1.55, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -2.32, - "z": -29.4, - "chao": -0.065, - "distWaypoint": 1.34, - "yOrigem": -0.023, - "vaoOrigem": 0.042, - "baseMesh": -0.055, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -1.17, - "z": -29.4, - "chao": -0.051, - "distWaypoint": 0.87, - "yOrigem": -0.009, - "vaoOrigem": 0.042, - "baseMesh": -0.041, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -0.02, - "z": -29.4, - "chao": -0.036, - "distWaypoint": 0.55, - "yOrigem": 0.006, - "vaoOrigem": 0.042, - "baseMesh": -0.026, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": 1.13, - "z": -29.4, - "chao": -0.02, - "distWaypoint": 1.58, - "yOrigem": 0.022, - "vaoOrigem": 0.042, - "baseMesh": -0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": 2.28, - "z": -29.4, - "chao": -0.005, - "distWaypoint": 0.66, - "yOrigem": 0.037, - "vaoOrigem": 0.042, - "baseMesh": 0.005, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": 3.43, - "z": -29.4, - "chao": 0.01, - "distWaypoint": 0.74, - "yOrigem": 0.052, - "vaoOrigem": 0.042, - "baseMesh": 0.02, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": 4.58, - "z": -29.4, - "chao": 0.022, - "distWaypoint": 1.48, - "yOrigem": 0.064, - "vaoOrigem": 0.042, - "baseMesh": 0.032, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": 5.72, - "z": -29.4, - "chao": 0.032, - "distWaypoint": 0.49, - "yOrigem": 0.074, - "vaoOrigem": 0.042, - "baseMesh": 0.042, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": 6.88, - "z": -29.4, - "chao": 0.039, - "distWaypoint": 0.96, - "yOrigem": 0.081, - "vaoOrigem": 0.042, - "baseMesh": 0.049, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": 8.03, - "z": -29.4, - "chao": 0.043, - "distWaypoint": 1.24, - "yOrigem": 0.085, - "vaoOrigem": 0.042, - "baseMesh": 0.053, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": 9.18, - "z": -29.4, - "chao": 0.043, - "distWaypoint": 0.4, - "yOrigem": 0.085, - "vaoOrigem": 0.042, - "baseMesh": 0.053, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": 10.32, - "z": -29.4, - "chao": 0.04, - "distWaypoint": 1.19, - "yOrigem": 0.082, - "vaoOrigem": 0.042, - "baseMesh": 0.05, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -2.9, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.75, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -1.75, - "z": 32.6, - "chao": 0, - "distWaypoint": 2.09, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -0.6, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.61, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": 0.55, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.86, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": 1.7, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.94, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": 2.85, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": 4, - "z": 32.6, - "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": 5.15, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.81, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": 6.3, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.63, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": 7.45, - "z": 32.6, - "chao": 0, - "distWaypoint": 2.16, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": 8.6, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.71, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": 9.75, - "z": 32.6, - "chao": 0, - "distWaypoint": 1.69, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": 10.9, - "z": 32.6, - "chao": 0, - "distWaypoint": 2.19, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -2.32, - "z": 29.4, - "chao": -0.06, - "distWaypoint": 2.05, - "yOrigem": -0.018, - "vaoOrigem": 0.042, - "baseMesh": -0.05, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -1.17, - "z": 29.4, - "chao": -0.045, - "distWaypoint": 1.78, - "yOrigem": -0.003, - "vaoOrigem": 0.042, - "baseMesh": -0.035, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -0.02, - "z": 29.4, - "chao": -0.029, - "distWaypoint": 1.64, - "yOrigem": 0.013, - "vaoOrigem": 0.042, - "baseMesh": -0.019, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": 1.13, - "z": 29.4, - "chao": -0.014, - "distWaypoint": 2.21, - "yOrigem": 0.028, - "vaoOrigem": 0.042, - "baseMesh": -0.004, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": 2.28, - "z": 29.4, - "chao": 0.001, - "distWaypoint": 1.68, - "yOrigem": 0.043, - "vaoOrigem": 0.042, - "baseMesh": 0.011, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": 3.43, - "z": 29.4, - "chao": 0.013, - "distWaypoint": 1.72, - "yOrigem": 0.055, - "vaoOrigem": 0.042, - "baseMesh": 0.023, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": 4.58, - "z": 29.4, - "chao": 0.023, - "distWaypoint": 2.14, - "yOrigem": 0.065, - "vaoOrigem": 0.042, - "baseMesh": 0.033, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": 5.72, - "z": 29.4, - "chao": 0.03, - "distWaypoint": 1.62, - "yOrigem": 0.072, - "vaoOrigem": 0.042, - "baseMesh": 0.04, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": 6.88, - "z": 29.4, - "chao": 0.034, - "distWaypoint": 1.82, - "yOrigem": 0.076, - "vaoOrigem": 0.042, - "baseMesh": 0.044, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": 8.03, - "z": 29.4, - "chao": 0.034, - "distWaypoint": 1.99, - "yOrigem": 0.076, - "vaoOrigem": 0.042, - "baseMesh": 0.044, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": 9.18, - "z": 29.4, - "chao": 0.029, - "distWaypoint": 1.6, - "yOrigem": 0.071, - "vaoOrigem": 0.042, - "baseMesh": 0.039, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": 10.32, - "z": 29.4, - "chao": 0.021, - "distWaypoint": 1.96, - "yOrigem": 0.063, - "vaoOrigem": 0.042, - "baseMesh": 0.031, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - } - ] - }, - { - "map": "atacadao_treta", - "waypoints": 283, - "pickups": 66, - "spawnPiorDistWaypoint": 1.84, - "celulasAlcancadas": 46509, - "semAlcance": 0, - "semAlcanceWpVelho": 6, - "semAlcanceRetaVelho": 4, - "piorDistAndavel": 0.16, - "abaixoDoPiso": 0, - "flutuando": 0, - "piorDistWaypoint": 3.19, - "piorChao": 0, - "piorVao": 0.01, - "itens": [ - { - "arma": "awp", - "fonte": "mapa", - "x": -12, - "z": -35, - "chao": 0, - "distWaypoint": 1.61, - "yOrigem": -0.01, - "vaoOrigem": -0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -9, - "z": -35, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": 0.15, - "vaoOrigem": 0.15, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -6, - "z": -35, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.11, - "vaoOrigem": 0.11, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": -3, - "z": -35, - "chao": 0, - "distWaypoint": 2.28, - "yOrigem": 0.035, - "vaoOrigem": 0.035, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 3, - "z": -35, - "chao": 0, - "distWaypoint": 2.28, - "yOrigem": 0.12, - "vaoOrigem": 0.12, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 6, - "z": -35, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.09, - "vaoOrigem": 0.09, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 9, - "z": -35, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": 0.06, - "vaoOrigem": 0.06, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "mapa", - "x": -9, - "z": 29, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": -0.01, - "vaoOrigem": -0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -6, - "z": 29, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.15, - "vaoOrigem": 0.15, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -3, - "z": 29, - "chao": 0, - "distWaypoint": 1.98, - "yOrigem": 0.11, - "vaoOrigem": 0.11, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": 29, - "chao": 0, - "distWaypoint": 2.13, - "yOrigem": 0.035, - "vaoOrigem": 0.035, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 3, - "z": 29, - "chao": 0, - "distWaypoint": 1.98, - "yOrigem": 0.12, - "vaoOrigem": 0.12, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 6, - "z": 29, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.09, - "vaoOrigem": 0.09, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 9, - "z": 29, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": 0.06, - "vaoOrigem": 0.06, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -12, - "z": -7, - "chao": 0, - "distWaypoint": 1.28, - "yOrigem": 0.15, - "vaoOrigem": 0.15, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": 12, - "z": -7, - "chao": 0, - "distWaypoint": 1.28, - "yOrigem": 0.11, - "vaoOrigem": 0.11, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -2.1, - "z": -38.6, - "chao": 0, - "distWaypoint": 3.04, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": 2.1, - "z": -38.6, - "chao": 0, - "distWaypoint": 3.04, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": 3.13, - "z": -38.6, - "chao": 0, - "distWaypoint": 2.18, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": 4.28, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.49, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": 5.43, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.54, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": 6.58, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.99, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": 7.73, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.43, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": 8.88, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.65, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": 10.03, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.82, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": 11.18, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.4, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": 12.33, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.8, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": 13.48, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.68, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": 14.63, - "z": -38.6, - "chao": 0, - "distWaypoint": 1.42, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -2.1, - "z": -35.4, - "chao": 0, - "distWaypoint": 3.04, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": 2.1, - "z": -35.4, - "chao": 0, - "distWaypoint": 3.04, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": 3.13, - "z": -35.4, - "chao": 0, - "distWaypoint": 2.18, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": 4.28, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": 5.43, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.53, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": 6.58, - "z": -35.4, - "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": 7.72, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.43, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": 8.88, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.65, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": 10.03, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.83, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": 11.18, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.4, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": 12.33, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.8, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": 13.47, - "z": -35.4, - "chao": 0, - "distWaypoint": 1.68, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -14.9, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.54, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -13.75, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.68, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -12.6, - "z": 30.6, - "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": -11.45, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.32, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": -10.3, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.92, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": -9.15, - "z": 30.6, - "chao": 0, - "distWaypoint": 1.17, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": -8, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": -6.85, - "z": 30.6, - "chao": 0, - "distWaypoint": 1.17, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": -5.7, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.92, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": -4.55, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.32, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": -3.4, - "z": 30.6, - "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": -2.25, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.68, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": -1.1, - "z": 30.6, - "chao": 0, - "distWaypoint": 0.54, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -14.32, - "z": 26.95, - "chao": 0, - "distWaypoint": 2.95, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -13.17, - "z": 27.4, - "chao": 0, - "distWaypoint": 1.99, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -12.02, - "z": 27.4, - "chao": 0, - "distWaypoint": 0.85, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": -10.88, - "z": 27.4, - "chao": 0, - "distWaypoint": 0.38, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": -9.72, - "z": 27.4, - "chao": 0, - "distWaypoint": 1.49, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": -8.95, - "z": 27.4, - "chao": 0, - "distWaypoint": 2.26, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": -7.42, - "z": 28.05, - "chao": 0, - "distWaypoint": 2.42, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": -1.57, - "z": 27.4, - "chao": 0, - "distWaypoint": 3, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": -5.13, - "z": 28.05, - "chao": 0, - "distWaypoint": 2.37, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": -3.97, - "z": 28.05, - "chao": 0, - "distWaypoint": 2.49, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": -2.82, - "z": 28.05, - "chao": 0, - "distWaypoint": 2.65, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": -0.53, - "z": 27.4, - "chao": 0, - "distWaypoint": 3.19, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - } - ] - }, - { - "map": "parque_treta", - "waypoints": 410, - "pickups": 68, - "spawnPiorDistWaypoint": 2.2, - "celulasAlcancadas": 71572, - "semAlcance": 0, - "semAlcanceWpVelho": 13, - "semAlcanceRetaVelho": 4, - "piorDistAndavel": 0.16, - "abaixoDoPiso": 0, - "flutuando": 0, - "piorDistWaypoint": 3.65, - "piorChao": 0, - "piorVao": 0.01, - "itens": [ - { - "arma": "awp", - "fonte": "mapa", - "x": -12, - "z": -37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -8, - "z": -37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -4, - "z": -37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": -37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 4, - "z": -37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 8, - "z": -37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 12, - "z": -37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "mapa", - "x": -12, - "z": 37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -8, - "z": 37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -4, - "z": 37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": 37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 4, - "z": 37.5, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 8, - "z": 37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 12, - "z": 37.5, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -9, - "z": -7, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": 9, - "z": 7, - "chao": 0, - "distWaypoint": 1.17, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 9, - "z": -7, - "chao": 0, - "distWaypoint": 1.17, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": -9, - "z": 7, - "chao": 0, - "distWaypoint": 1.72, - "yOrigem": 0.07, - "vaoOrigem": 0.07, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -15.9, - "z": -40.1, - "chao": 0, - "distWaypoint": 1.3, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -14.75, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.76, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -13.6, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.41, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": -12.45, - "z": -40.1, - "chao": 0, - "distWaypoint": 1.55, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": -11.3, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.51, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": -10.15, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.66, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": -9, - "z": -40.1, - "chao": 0, - "distWaypoint": 1.4, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": -7.85, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.27, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": -6.7, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.91, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": -5.55, - "z": -40.1, - "chao": 0, - "distWaypoint": 1.15, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": -4.4, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.1, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": -3.25, - "z": -40.1, - "chao": 0, - "distWaypoint": 1.15, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": -2.1, - "z": -40.1, - "chao": 0, - "distWaypoint": 0.91, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -15.32, - "z": -36.9, - "chao": 0, - "distWaypoint": 1.33, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -14.17, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -13.02, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.98, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": -11.88, - "z": -36.9, - "chao": 0, - "distWaypoint": 1.08, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": -10.72, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.13, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": -9.57, - "z": -36.9, - "chao": 0, - "distWaypoint": 1.23, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": -8.43, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.83, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": -7.28, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.34, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": -6.13, - "z": -36.9, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": -4.97, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": -3.82, - "z": -36.9, - "chao": 0, - "distWaypoint": 0.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": -2.68, - "z": -36.9, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -15.9, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.55, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -14.75, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.38, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -13.6, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.32, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": -12.45, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.65, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": -11.3, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.34, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": -10.15, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.36, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": -9, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": -7.85, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.31, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": -6.7, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.42, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": -5.55, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.49, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": -4.4, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.3, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": -3.25, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.49, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": -2.1, - "z": 40.1, - "chao": 0, - "distWaypoint": 3.42, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": false, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -15.32, - "z": 36.9, - "chao": 0, - "distWaypoint": 1.33, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -14.17, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -13.02, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.98, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": -11.88, - "z": 36.9, - "chao": 0, - "distWaypoint": 1.08, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": -10.72, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.12, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": -9.57, - "z": 36.9, - "chao": 0, - "distWaypoint": 1.23, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": -8.43, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.83, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": -7.28, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.34, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": -6.13, - "z": 36.9, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": -4.97, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": -3.82, - "z": 36.9, - "chao": 0, - "distWaypoint": 0.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": -2.68, - "z": 36.9, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - } - ] - }, - { - "map": "velho_oeste", - "waypoints": 388, - "pickups": 66, - "spawnPiorDistWaypoint": 1.22, - "celulasAlcancadas": 71310, - "semAlcance": 0, - "semAlcanceWpVelho": 0, - "semAlcanceRetaVelho": 2, - "piorDistAndavel": 0.16, - "abaixoDoPiso": 0, - "flutuando": 0, - "piorDistWaypoint": 2.18, - "piorChao": 0, - "piorVao": 0.01, - "itens": [ - { - "arma": "awp", - "fonte": "mapa", - "x": -12, - "z": -40, - "chao": 0, - "distWaypoint": 0.82, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -8, - "z": -40, - "chao": 0, - "distWaypoint": 0.89, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -4, - "z": -40, - "chao": 0, - "distWaypoint": 1.28, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": -40, - "chao": 0, - "distWaypoint": 1.79, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 4, - "z": -40, - "chao": 0, - "distWaypoint": 1.44, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 8, - "z": -40, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 12, - "z": -40, - "chao": 0, - "distWaypoint": 0.8, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "mapa", - "x": 12, - "z": 40, - "chao": 0, - "distWaypoint": 0.8, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": 8, - "z": 40, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": 4, - "z": 40, - "chao": 0, - "distWaypoint": 1.44, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 0, - "z": 40, - "chao": 0, - "distWaypoint": 1.79, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": -4, - "z": 40, - "chao": 0, - "distWaypoint": 1.28, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": -8, - "z": 40, - "chao": 0, - "distWaypoint": 0.89, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": -12, - "z": 40, - "chao": 0, - "distWaypoint": 0.82, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": -2, - "z": 0, - "chao": 0, - "distWaypoint": 0.4, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 2, - "z": 0, - "chao": 0, - "distWaypoint": 0.2, - "yOrigem": 0.13, - "vaoOrigem": 0.13, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -18.9, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.63, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -17.75, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.81, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -16.6, - "z": -42.6, - "chao": 0, - "distWaypoint": 2.13, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": -15.45, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.62, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": -14.3, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": -13.15, - "z": -42.6, - "chao": 0, - "distWaypoint": 2.09, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": -12, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.61, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": -10.85, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.86, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": -9.7, - "z": -42.6, - "chao": 0, - "distWaypoint": 2.06, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": -8.55, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.61, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": -7.4, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.89, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": -6.25, - "z": -42.6, - "chao": 0, - "distWaypoint": 2.03, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": -5.1, - "z": -42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -18.32, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.43, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -17.18, - "z": -39.4, - "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -16.02, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.63, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": -14.88, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.44, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": -13.72, - "z": -39.4, - "chao": 0, - "distWaypoint": 2.03, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": -12.57, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": -11.43, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.45, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": -10.28, - "z": -39.4, - "chao": 0, - "distWaypoint": 2.07, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": -9.13, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.58, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": -7.97, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.46, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": -6.82, - "z": -39.4, - "chao": 0, - "distWaypoint": 2.11, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": -5.68, - "z": -39.4, - "chao": 0, - "distWaypoint": 1.55, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": 5.1, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": 6.25, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.91, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": 7.4, - "z": 42.6, - "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": 8.55, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": 9.7, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.94, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": 10.85, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.97, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": 12, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": 13.15, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.97, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": 14.3, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.94, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": 15.45, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": 16.6, - "z": 42.6, - "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": 17.75, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.91, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": 18.9, - "z": 42.6, - "chao": 0, - "distWaypoint": 1.6, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": 5.68, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": 6.83, - "z": 39.4, - "chao": 0, - "distWaypoint": 2.14, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": 7.98, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.53, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": 9.13, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": 10.28, - "z": 39.4, - "chao": 0, - "distWaypoint": 2.18, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": 11.43, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.51, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": 12.57, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.51, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": 13.72, - "z": 39.4, - "chao": 0, - "distWaypoint": 2.18, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": 14.88, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": 16.02, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.53, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": 17.18, - "z": 39.4, - "chao": 0, - "distWaypoint": 2.14, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.16, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": 18.32, - "z": 39.4, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - } - ] - }, - { - "map": "penitenciaria", - "waypoints": 584, - "pickups": 66, - "spawnPiorDistWaypoint": 1.98, - "celulasAlcancadas": 99250, - "semAlcance": 0, - "semAlcanceWpVelho": 0, - "semAlcanceRetaVelho": 3, - "piorDistAndavel": 0.15, - "abaixoDoPiso": 0, - "flutuando": 0, - "piorDistWaypoint": 2.62, - "piorChao": 0, - "piorVao": 0.01, - "itens": [ - { - "arma": "awp", - "fonte": "mapa", - "x": -10, - "z": 2.2, - "chao": 0, - "distWaypoint": 0.58, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -7.14, - "z": -2.2, - "chao": 0, - "distWaypoint": 0.91, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -4.29, - "z": 2.2, - "chao": 0, - "distWaypoint": 0.35, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.08, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": -1.43, - "z": -2.2, - "chao": 0, - "distWaypoint": 1.04, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "mapa", - "x": 1.43, - "z": 2.2, - "chao": 0, - "distWaypoint": 0.92, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 4.29, - "z": -2.2, - "chao": 0, - "distWaypoint": 1.51, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.15, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "mapa", - "x": 7.14, - "z": 2.2, - "chao": 0, - "distWaypoint": 1.59, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "mapa", - "x": 10, - "z": -2.2, - "chao": 0, - "distWaypoint": 1.58, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": -15, - "z": -41, - "chao": 0, - "distWaypoint": 1.84, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "mapa", - "x": 15, - "z": 41, - "chao": 0, - "distWaypoint": 0.71, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": -5, - "z": -41, - "chao": 0, - "distWaypoint": 1.58, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "mapa", - "x": 5, - "z": 41, - "chao": 0, - "distWaypoint": 0.86, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 5, - "z": -41, - "chao": 0, - "distWaypoint": 1.39, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": -5, - "z": 41, - "chao": 0, - "distWaypoint": 1.14, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": 15, - "z": -41, - "chao": 0, - "distWaypoint": 1.3, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": -15, - "z": 41, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.155, - "vaoOrigem": 0.155, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": -21.9, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.57, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": -20.75, - "z": -43.6, - "chao": 0, - "distWaypoint": 0.96, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": -19.6, - "z": -43.6, - "chao": 0, - "distWaypoint": 0.86, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": -18.45, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.7, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": -17.3, - "z": -43.6, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": -16.15, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.03, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": -15, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.48, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": -13.85, - "z": -43.6, - "chao": 0, - "distWaypoint": 0.72, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": -12.7, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.22, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": -11.55, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.26, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": -10.4, - "z": -43.6, - "chao": 0, - "distWaypoint": 0.71, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": -9.25, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.43, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.1, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": -8.1, - "z": -43.6, - "chao": 0, - "distWaypoint": 1.06, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": -21.32, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.32, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.03, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": -20.18, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.51, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": -19.02, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.19, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.08, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": -17.88, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.1, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.02, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": -16.73, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.53, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": -15.57, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.42, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.03, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": -14.43, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.88, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": -13.28, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.66, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.08, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": -12.13, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.65, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.02, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": -10.97, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.69, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.12, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "revolver38", - "fonte": "rack", - "x": -9.82, - "z": -45.6, - "chao": 0, - "distWaypoint": 0.84, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.03, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "pistol", - "fonte": "rack", - "x": -8.68, - "z": -45.6, - "chao": 0, - "distWaypoint": 1.46, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "awp", - "fonte": "rack", - "x": 8.1, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.61, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mosin", - "fonte": "rack", - "x": 9.25, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.56, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "rem700", - "fonte": "rack", - "x": 10.4, - "z": 43.6, - "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m400", - "fonte": "rack", - "x": 11.55, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.36, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "svd", - "fonte": "rack", - "x": 12.7, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.81, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3sg1", - "fonte": "rack", - "x": 13.85, - "z": 43.6, - "chao": 0, - "distWaypoint": 1.25, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "sks", - "fonte": "rack", - "x": 15, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.14, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "ak", - "fonte": "rack", - "x": 16.15, - "z": 43.6, - "chao": 0, - "distWaypoint": 1.05, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "akm", - "fonte": "rack", - "x": 17.3, - "z": 43.6, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m4", - "fonte": "rack", - "x": 18.45, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.18, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "md97", - "fonte": "rack", - "x": 19.6, - "z": 43.6, - "chao": 0, - "distWaypoint": 1.3, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.07, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "rack", - "x": 20.75, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.76, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.11, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "scar", - "fonte": "rack", - "x": 21.9, - "z": 43.6, - "chao": 0, - "distWaypoint": 0.41, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.05, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "carbine", - "fonte": "rack", - "x": 8.68, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.1, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "m92", - "fonte": "rack", - "x": 9.83, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.38, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "tavor", - "fonte": "rack", - "x": 10.98, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.29, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "famas", - "fonte": "rack", - "x": 12.13, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.11, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "p90", - "fonte": "rack", - "x": 13.28, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.51, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "mp5", - "fonte": "rack", - "x": 14.43, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.21, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "rack", - "x": 15.57, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.15, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "rack", - "x": 16.73, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.62, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.09, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "lmg", - "fonte": "rack", - "x": 17.88, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.14, - "yOrigem": 0.042, - "vaoOrigem": 0.042, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.06, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "rack", - "x": 19.02, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.22, - "yOrigem": 0.042, + "x": 8.03, + "z": 29.4, + "chao": 0.034, + "distWaypoint": 1.99, + "yOrigem": 0.076, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.044, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -14861,15 +8463,15 @@ { "arma": "revolver38", "fonte": "rack", - "x": 20.18, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.48, - "yOrigem": 0.042, + "x": 9.18, + "z": 29.4, + "chao": 0.029, + "distWaypoint": 1.6, + "yOrigem": 0.071, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.039, "vao": 0.01, - "distAndavel": 0.06, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -14880,15 +8482,15 @@ { "arma": "pistol", "fonte": "rack", - "x": 21.32, - "z": 45.6, - "chao": 0, - "distWaypoint": 2.11, - "yOrigem": 0.042, + "x": 10.32, + "z": 29.4, + "chao": 0.021, + "distWaypoint": 1.96, + "yOrigem": 0.063, "vaoOrigem": 0.042, - "baseMesh": 0.01, + "baseMesh": 0.031, "vao": 0.01, - "distAndavel": 0.09, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -14899,30 +8501,30 @@ ] }, { - "map": "treta_vietnan", - "waypoints": 613, - "pickups": 70, - "spawnPiorDistWaypoint": 1.12, - "celulasAlcancadas": 91060, + "map": "atacadao_treta", + "waypoints": 283, + "pickups": 66, + "spawnPiorDistWaypoint": 1.84, + "celulasAlcancadas": 46509, "semAlcance": 0, - "semAlcanceWpVelho": 0, - "semAlcanceRetaVelho": 5, - "piorDistAndavel": 0.25, + "semAlcanceWpVelho": 6, + "semAlcanceRetaVelho": 4, + "piorDistAndavel": 0.16, "abaixoDoPiso": 0, "flutuando": 0, - "piorDistWaypoint": 2.89, + "piorDistWaypoint": 3.19, "piorChao": 0, "piorVao": 0.01, "itens": [ { "arma": "awp", "fonte": "mapa", - "x": -16, - "z": -34, + "x": -12, + "z": -35, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.61, + "yOrigem": -0.01, + "vaoOrigem": -0.01, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -14936,12 +8538,12 @@ { "arma": "ak", "fonte": "mapa", - "x": -12, - "z": -34, + "x": -9, + "z": -35, "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.72, + "yOrigem": 0.15, + "vaoOrigem": 0.15, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -14955,12 +8557,12 @@ { "arma": "m4", "fonte": "mapa", - "x": -8, - "z": -34, + "x": -6, + "z": -35, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.84, + "yOrigem": 0.11, + "vaoOrigem": 0.11, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -14974,12 +8576,12 @@ { "arma": "shotgun", "fonte": "mapa", - "x": -4, - "z": -34, + "x": -3, + "z": -35, "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 2.28, + "yOrigem": 0.035, + "vaoOrigem": 0.035, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -14993,12 +8595,12 @@ { "arma": "mp5", "fonte": "mapa", - "x": 0, - "z": -34, + "x": 3, + "z": -35, "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 2.28, + "yOrigem": 0.12, + "vaoOrigem": 0.12, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15012,12 +8614,12 @@ { "arma": "deagle", "fonte": "mapa", - "x": 4, - "z": -34, + "x": 6, + "z": -35, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.84, + "yOrigem": 0.09, + "vaoOrigem": 0.09, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15031,50 +8633,12 @@ { "arma": "pistol", "fonte": "mapa", - "x": 8, - "z": -34, - "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.25, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "g3", - "fonte": "mapa", - "x": 12, - "z": -34, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.01, - "vaoOrigem": 0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "uzi", - "fonte": "mapa", - "x": 16, - "z": -34, + "x": 9, + "z": -35, "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.72, + "yOrigem": 0.06, + "vaoOrigem": 0.06, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15088,12 +8652,12 @@ { "arma": "awp", "fonte": "mapa", - "x": 16, - "z": 34, + "x": -9, + "z": 29, "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.72, + "yOrigem": -0.01, + "vaoOrigem": -0.01, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15107,12 +8671,12 @@ { "arma": "ak", "fonte": "mapa", - "x": 12, - "z": 34, + "x": -6, + "z": 29, "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.84, + "yOrigem": 0.15, + "vaoOrigem": 0.15, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15126,31 +8690,12 @@ { "arma": "m4", "fonte": "mapa", - "x": 8, - "z": 34, - "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0.25, - "retaDoSpawn": false, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "shotgun", - "fonte": "mapa", - "x": 4, - "z": 34, + "x": -3, + "z": 29, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.98, + "yOrigem": 0.11, + "vaoOrigem": 0.11, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15162,33 +8707,14 @@ "okAssentada": true }, { - "arma": "mp5", + "arma": "shotgun", "fonte": "mapa", "x": 0, - "z": 34, - "chao": 0, - "distWaypoint": 1, - "yOrigem": 0.01, - "vaoOrigem": 0.01, - "baseMesh": 0.01, - "vao": 0.01, - "distAndavel": 0, - "retaDoSpawn": true, - "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, - "okAlcance": true, - "okNivel": true, - "okAssentada": true - }, - { - "arma": "deagle", - "fonte": "mapa", - "x": -4, - "z": 34, + "z": 29, "chao": 0, - "distWaypoint": 1.41, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 2.13, + "yOrigem": 0.035, + "vaoOrigem": 0.035, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15200,14 +8726,14 @@ "okAssentada": true }, { - "arma": "pistol", + "arma": "mp5", "fonte": "mapa", - "x": -8, - "z": 34, + "x": 3, + "z": 29, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.98, + "yOrigem": 0.12, + "vaoOrigem": 0.12, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15219,14 +8745,14 @@ "okAssentada": true }, { - "arma": "g3", + "arma": "deagle", "fonte": "mapa", - "x": -12, - "z": 34, + "x": 6, + "z": 29, "chao": 0, - "distWaypoint": 2, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.84, + "yOrigem": 0.09, + "vaoOrigem": 0.09, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15238,14 +8764,14 @@ "okAssentada": true }, { - "arma": "uzi", + "arma": "pistol", "fonte": "mapa", - "x": -16, - "z": 34, + "x": 9, + "z": 29, "chao": 0, - "distWaypoint": 2.24, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.72, + "yOrigem": 0.06, + "vaoOrigem": 0.06, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15259,12 +8785,12 @@ { "arma": "ak", "fonte": "mapa", - "x": -16.5, - "z": 0, + "x": -12, + "z": -7, "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.28, + "yOrigem": 0.15, + "vaoOrigem": 0.15, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15278,12 +8804,12 @@ { "arma": "m4", "fonte": "mapa", - "x": 16.5, - "z": 0, + "x": 12, + "z": -7, "chao": 0, - "distWaypoint": 1.5, - "yOrigem": 0.01, - "vaoOrigem": 0.01, + "distWaypoint": 1.28, + "yOrigem": 0.11, + "vaoOrigem": 0.11, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0, @@ -15297,17 +8823,17 @@ { "arma": "awp", "fonte": "rack", - "x": -18.9, - "z": -38.1, + "x": -2.1, + "z": -38.6, "chao": 0, - "distWaypoint": 1.27, + "distWaypoint": 3.04, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0.14, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, @@ -15316,17 +8842,17 @@ { "arma": "mosin", "fonte": "rack", - "x": -17.75, - "z": -38.1, + "x": 2.1, + "z": -38.6, "chao": 0, - "distWaypoint": 0.93, + "distWaypoint": 3.04, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.14, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, @@ -15335,15 +8861,15 @@ { "arma": "rem700", "fonte": "rack", - "x": -16.6, - "z": -38.1, + "x": 3.13, + "z": -38.6, "chao": 0, - "distWaypoint": 1.66, + "distWaypoint": 2.18, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15354,15 +8880,15 @@ { "arma": "m400", "fonte": "rack", - "x": -15.45, - "z": -38.1, + "x": 4.28, + "z": -38.6, "chao": 0, - "distWaypoint": 1.01, + "distWaypoint": 1.49, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15373,15 +8899,15 @@ { "arma": "svd", "fonte": "rack", - "x": -14.3, - "z": -38.1, + "x": 5.43, + "z": -38.6, "chao": 0, - "distWaypoint": 1.14, + "distWaypoint": 1.54, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.12, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15392,15 +8918,15 @@ { "arma": "g3sg1", "fonte": "rack", - "x": -13.15, - "z": -38.1, + "x": 6.58, + "z": -38.6, "chao": 0, - "distWaypoint": 1.46, + "distWaypoint": 1.99, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15411,10 +8937,10 @@ { "arma": "sks", "fonte": "rack", - "x": -12, - "z": -38.1, + "x": 7.73, + "z": -38.6, "chao": 0, - "distWaypoint": 0.9, + "distWaypoint": 1.43, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15430,15 +8956,15 @@ { "arma": "ak", "fonte": "rack", - "x": -10.85, - "z": -38.1, + "x": 8.88, + "z": -38.6, "chao": 0, - "distWaypoint": 1.46, + "distWaypoint": 1.65, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15449,15 +8975,15 @@ { "arma": "akm", "fonte": "rack", - "x": -9.7, - "z": -38.1, + "x": 10.03, + "z": -38.6, "chao": 0, - "distWaypoint": 1.14, + "distWaypoint": 1.82, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15468,15 +8994,15 @@ { "arma": "m4", "fonte": "rack", - "x": -8.55, - "z": -38.1, + "x": 11.18, + "z": -38.6, "chao": 0, - "distWaypoint": 1.01, + "distWaypoint": 1.4, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.12, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15487,15 +9013,15 @@ { "arma": "md97", "fonte": "rack", - "x": -7.4, - "z": -38.1, + "x": 12.33, + "z": -38.6, "chao": 0, - "distWaypoint": 1.66, + "distWaypoint": 1.8, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15506,10 +9032,10 @@ { "arma": "g3", "fonte": "rack", - "x": -6.25, - "z": -38.1, + "x": 13.48, + "z": -38.6, "chao": 0, - "distWaypoint": 0.93, + "distWaypoint": 1.68, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15525,15 +9051,15 @@ { "arma": "scar", "fonte": "rack", - "x": -5.1, - "z": -38.1, + "x": 14.63, + "z": -38.6, "chao": 0, - "distWaypoint": 1.27, + "distWaypoint": 1.42, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15544,17 +9070,17 @@ { "arma": "carbine", "fonte": "rack", - "x": -18.32, - "z": -34.9, + "x": -2.1, + "z": -35.4, "chao": 0, - "distWaypoint": 1.15, + "distWaypoint": 3.04, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.14, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, @@ -15563,17 +9089,17 @@ { "arma": "m92", "fonte": "rack", - "x": -17.18, - "z": -34.9, + "x": 2.1, + "z": -35.4, "chao": 0, - "distWaypoint": 1.38, + "distWaypoint": 3.04, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.14, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, @@ -15582,15 +9108,15 @@ { "arma": "tavor", "fonte": "rack", - "x": -16.02, - "z": -34.9, + "x": 3.13, + "z": -35.4, "chao": 0, - "distWaypoint": 1.5, + "distWaypoint": 2.18, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15601,15 +9127,15 @@ { "arma": "famas", "fonte": "rack", - "x": -14.88, - "z": -34.9, + "x": 4.28, + "z": -35.4, "chao": 0, - "distWaypoint": 1.11, + "distWaypoint": 1.5, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15620,15 +9146,15 @@ { "arma": "p90", "fonte": "rack", - "x": -13.72, - "z": -34.9, + "x": 5.43, + "z": -35.4, "chao": 0, - "distWaypoint": 1.68, + "distWaypoint": 1.53, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15639,10 +9165,10 @@ { "arma": "mp5", "fonte": "rack", - "x": -12.57, - "z": -34.9, + "x": 6.58, + "z": -35.4, "chao": 0, - "distWaypoint": 1.24, + "distWaypoint": 2, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15658,15 +9184,15 @@ { "arma": "uzi", "fonte": "rack", - "x": -11.43, - "z": -34.9, + "x": 7.72, + "z": -35.4, "chao": 0, - "distWaypoint": 1.24, + "distWaypoint": 1.43, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15677,15 +9203,15 @@ { "arma": "shotgun", "fonte": "rack", - "x": -10.28, - "z": -34.9, + "x": 8.88, + "z": -35.4, "chao": 0, - "distWaypoint": 1.68, + "distWaypoint": 1.65, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15696,15 +9222,15 @@ { "arma": "lmg", "fonte": "rack", - "x": -9.13, - "z": -34.9, + "x": 10.03, + "z": -35.4, "chao": 0, - "distWaypoint": 1.11, + "distWaypoint": 1.83, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15715,15 +9241,15 @@ { "arma": "deagle", "fonte": "rack", - "x": -8.2, - "z": -34.9, + "x": 11.18, + "z": -35.4, "chao": 0, - "distWaypoint": 1.36, + "distWaypoint": 1.4, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15734,18 +9260,18 @@ { "arma": "revolver38", "fonte": "rack", - "x": -6.82, - "z": -33.88, + "x": 12.33, + "z": -35.4, "chao": 0, - "distWaypoint": 1.21, + "distWaypoint": 1.8, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.14, - "retaDoSpawn": false, + "distAndavel": 0.13, + "retaDoSpawn": true, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": false, + "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -15753,15 +9279,15 @@ { "arma": "pistol", "fonte": "rack", - "x": -5.68, - "z": -34.9, + "x": 13.47, + "z": -35.4, "chao": 0, - "distWaypoint": 1.93, + "distWaypoint": 1.68, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -15772,10 +9298,10 @@ { "arma": "awp", "fonte": "rack", - "x": 5.1, - "z": 38.1, + "x": -14.9, + "z": 30.6, "chao": 0, - "distWaypoint": 1.27, + "distWaypoint": 0.54, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15791,10 +9317,10 @@ { "arma": "mosin", "fonte": "rack", - "x": 6.25, - "z": 38.1, + "x": -13.75, + "z": 30.6, "chao": 0, - "distWaypoint": 0.93, + "distWaypoint": 0.68, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15810,10 +9336,10 @@ { "arma": "rem700", "fonte": "rack", - "x": 7.4, - "z": 38.1, + "x": -12.6, + "z": 30.6, "chao": 0, - "distWaypoint": 1.66, + "distWaypoint": 1.41, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15829,10 +9355,10 @@ { "arma": "m400", "fonte": "rack", - "x": 8.55, - "z": 38.1, + "x": -11.45, + "z": 30.6, "chao": 0, - "distWaypoint": 1.01, + "distWaypoint": 0.32, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15848,10 +9374,10 @@ { "arma": "svd", "fonte": "rack", - "x": 9.7, - "z": 38.1, + "x": -10.3, + "z": 30.6, "chao": 0, - "distWaypoint": 1.14, + "distWaypoint": 0.92, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15867,10 +9393,10 @@ { "arma": "g3sg1", "fonte": "rack", - "x": 10.85, - "z": 38.1, + "x": -9.15, + "z": 30.6, "chao": 0, - "distWaypoint": 1.46, + "distWaypoint": 1.17, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15886,10 +9412,10 @@ { "arma": "sks", "fonte": "rack", - "x": 12, - "z": 38.1, + "x": -8, + "z": 30.6, "chao": 0, - "distWaypoint": 0.9, + "distWaypoint": 0.2, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15905,10 +9431,10 @@ { "arma": "ak", "fonte": "rack", - "x": 13.15, - "z": 38.1, + "x": -6.85, + "z": 30.6, "chao": 0, - "distWaypoint": 1.46, + "distWaypoint": 1.17, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15924,10 +9450,10 @@ { "arma": "akm", "fonte": "rack", - "x": 14.3, - "z": 38.1, + "x": -5.7, + "z": 30.6, "chao": 0, - "distWaypoint": 1.14, + "distWaypoint": 0.92, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15943,10 +9469,10 @@ { "arma": "m4", "fonte": "rack", - "x": 15.45, - "z": 38.1, + "x": -4.55, + "z": 30.6, "chao": 0, - "distWaypoint": 1.01, + "distWaypoint": 0.32, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15962,10 +9488,10 @@ { "arma": "md97", "fonte": "rack", - "x": 16.6, - "z": 38.1, + "x": -3.4, + "z": 30.6, "chao": 0, - "distWaypoint": 1.66, + "distWaypoint": 1.41, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -15981,10 +9507,10 @@ { "arma": "g3", "fonte": "rack", - "x": 17.75, - "z": 38.1, + "x": -2.25, + "z": 30.6, "chao": 0, - "distWaypoint": 0.93, + "distWaypoint": 0.68, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -16000,10 +9526,10 @@ { "arma": "scar", "fonte": "rack", - "x": 18.9, - "z": 38.1, + "x": -1.1, + "z": 30.6, "chao": 0, - "distWaypoint": 1.27, + "distWaypoint": 0.54, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, @@ -16019,18 +9545,18 @@ { "arma": "carbine", "fonte": "rack", - "x": 5.68, - "z": 34.9, + "x": -14.32, + "z": 26.95, "chao": 0, - "distWaypoint": 2.89, + "distWaypoint": 2.95, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, + "distAndavel": 0.09, + "retaDoSpawn": false, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, + "okAlcanceRetaVelho": false, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -16038,15 +9564,15 @@ { "arma": "m92", "fonte": "rack", - "x": 8.2, - "z": 34.9, + "x": -13.17, + "z": 27.4, "chao": 0, - "distWaypoint": 1.36, + "distWaypoint": 1.99, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.11, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16057,15 +9583,15 @@ { "arma": "tavor", "fonte": "rack", - "x": 9.13, - "z": 34.9, + "x": -12.02, + "z": 27.4, "chao": 0, - "distWaypoint": 1.11, + "distWaypoint": 0.85, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16076,15 +9602,15 @@ { "arma": "famas", "fonte": "rack", - "x": 10.28, - "z": 34.9, + "x": -10.88, + "z": 27.4, "chao": 0, - "distWaypoint": 1.68, + "distWaypoint": 0.38, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.16, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16095,15 +9621,15 @@ { "arma": "p90", "fonte": "rack", - "x": 11.43, - "z": 34.9, + "x": -9.72, + "z": 27.4, "chao": 0, - "distWaypoint": 1.24, + "distWaypoint": 1.49, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.1, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16114,18 +9640,18 @@ { "arma": "mp5", "fonte": "rack", - "x": 12.58, - "z": 34.9, + "x": -8.95, + "z": 27.4, "chao": 0, - "distWaypoint": 1.24, + "distWaypoint": 2.26, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, - "retaDoSpawn": true, + "distAndavel": 0.11, + "retaDoSpawn": false, "okAlcanceWpVelho": true, - "okAlcanceRetaVelho": true, + "okAlcanceRetaVelho": false, "okAlcance": true, "okNivel": true, "okAssentada": true @@ -16133,15 +9659,15 @@ { "arma": "uzi", "fonte": "rack", - "x": 13.72, - "z": 34.9, + "x": -7.42, + "z": 28.05, "chao": 0, - "distWaypoint": 1.68, + "distWaypoint": 2.42, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.09, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16152,17 +9678,17 @@ { "arma": "shotgun", "fonte": "rack", - "x": 14.88, - "z": 34.9, + "x": -1.57, + "z": 27.4, "chao": 0, - "distWaypoint": 1.11, + "distWaypoint": 3, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.16, + "distAndavel": 0.12, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, @@ -16171,15 +9697,15 @@ { "arma": "lmg", "fonte": "rack", - "x": 16.02, - "z": 34.9, + "x": -5.13, + "z": 28.05, "chao": 0, - "distWaypoint": 1.5, + "distWaypoint": 2.37, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.1, + "distAndavel": 0.13, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16190,15 +9716,15 @@ { "arma": "deagle", "fonte": "rack", - "x": 17.17, - "z": 34.9, + "x": -3.97, + "z": 28.05, "chao": 0, - "distWaypoint": 1.38, + "distWaypoint": 2.49, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.06, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16209,15 +9735,15 @@ { "arma": "revolver38", "fonte": "rack", - "x": 18.32, - "z": 34.9, + "x": -2.82, + "z": 28.05, "chao": 0, - "distWaypoint": 1.15, + "distWaypoint": 2.65, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, - "distAndavel": 0.13, + "distAndavel": 0.09, "retaDoSpawn": true, "okAlcanceWpVelho": true, "okAlcanceRetaVelho": true, @@ -16228,17 +9754,17 @@ { "arma": "pistol", "fonte": "rack", - "x": 19.47, - "z": 34.9, + "x": -0.53, + "z": 27.4, "chao": 0, - "distWaypoint": 1.84, + "distWaypoint": 3.19, "yOrigem": 0.042, "vaoOrigem": 0.042, "baseMesh": 0.01, "vao": 0.01, "distAndavel": 0.1, "retaDoSpawn": true, - "okAlcanceWpVelho": true, + "okAlcanceWpVelho": false, "okAlcanceRetaVelho": true, "okAlcance": true, "okNivel": true, diff --git a/tools/eval/portao-inteiro-check.mjs b/tools/eval/portao-inteiro-check.mjs new file mode 100644 index 000000000..b0b361e8f --- /dev/null +++ b/tools/eval/portao-inteiro-check.mjs @@ -0,0 +1,68 @@ +#!/usr/bin/env node +/* ============================================================================ + portao-inteiro-check.mjs — PORTÃO NÃO PODE CITAR PASSO QUE NÃO EXISTE + ---------------------------------------------------------------------------- + `check:fast` e `check:deploy` são listas de nomes de script. Se um nome citado + ali não está definido em `scripts`, o npm morre com "missing script" e o portão + inteiro para no meio - os passos DEPOIS do nome quebrado nunca rodam. + + DOIS CASOS REAIS, os dois em 22/08/2026: + · o PR #372 citava `eval:gelo` no `check:fast` e nunca definiu o script. A régua + `treta-gelo-check.mjs` existia e simplesmente não estava ligada em lugar nenhum; + · resolvendo o conflito de `package.json` do #408, eu fiquei com a linha do + `check:` de um lado e perdi as DEFINIÇÕES do outro. Três réguas viraram nome + órfão de uma vez - e conflito de `package.json` é justamente o que mais + acontece, porque todo PR que acrescenta régua mexe na mesma linha. + + PI1 · todo nome citado em `check:fast`/`check:deploy` existe em `scripts`. + PI2 · todo script `eval:*` aponta para arquivo que existe em disco. + + Uso: node tools/eval/portao-inteiro-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, existsSync } from 'node:fs'; + +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'passo-orfao': 'PI1', 'regua-fantasma': 'PI2' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +const pkg = JSON.parse(readFileSync('package.json', 'utf8')); +const scripts = { ...pkg.scripts }; +if (MUT === 'passo-orfao') scripts['check:fast'] += ' eval:nao-existe'; +if (MUT === 'regua-fantasma') scripts['eval:fantasma'] = 'node tools/eval/nao-existe-check.mjs'; + +const falhas = []; +const PORTOES = ['check:fast', 'check:deploy']; + +/* ---- PI1: nome citado tem de estar definido ---- */ +for (const portao of PORTOES) { + const linha = scripts[portao]; + if (!linha) { falhas.push(`PI1 o portão \`${portao}\` não existe em scripts`); continue; } + /* A linha é `node tools/eval/runner.mjs a b c`: passo é token com `:` que não é + caminho. `syntax` é o único passo sem `:` e está definido como script. */ + const passos = linha.split(/\s+/).slice(2).filter((t) => t && !t.includes('/')); + for (const passo of passos) { + if (!scripts[passo]) { + falhas.push(`PI1 ${portao} cita \`${passo}\`, que não está definido em scripts — o npm morre em "missing script" e os passos seguintes NÃO rodam`); + } + } +} + +/* ---- PI2: régua citada tem de existir em disco ---- */ +for (const [nome, cmd] of Object.entries(scripts)) { + if (nome.startsWith('//')) continue; // chave de documentação, não é script + const m = String(cmd).match(/node\s+(tools\/[^\s]+\.mjs)/); + if (m && !existsSync(m[1])) { + falhas.push(`PI2 \`${nome}\` aponta para ${m[1]}, que não existe em disco`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) { + const total = PORTOES.reduce((n, p) => n + (scripts[p] || '').split(/\s+/).slice(2).filter((t) => t && !t.includes('/')).length, 0); + console.log(` \x1b[32m✓\x1b[0m PI todo passo dos dois portões está definido e aponta para arquivo que existe (${total} citações)`); +} +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego (lei 3)`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); diff --git a/tools/eval/telas-menu7.mjs b/tools/eval/telas-menu7.mjs index 9a3334a71..e3d606391 100644 --- a/tools/eval/telas-menu7.mjs +++ b/tools/eval/telas-menu7.mjs @@ -21,9 +21,7 @@ const ONLY = process.env.ONLY ? new Set(process.env.ONLY.split(',')) : null; const want = (id) => !ONLY || ONLY.has(id); const gRoot = execSync('npm root -g').toString().trim(); -let _pw; -try { _pw = await import('playwright'); } -catch { _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); } +const _pw = await import(pathToFileURL(`${gRoot}/playwright/index.js`).href); const chromium = _pw.chromium || _pw.default?.chromium; mkdirSync(OUT, { recursive: true }); diff --git a/tools/eval/workflow-secret-check.mjs b/tools/eval/workflow-secret-check.mjs new file mode 100644 index 000000000..37254ec04 --- /dev/null +++ b/tools/eval/workflow-secret-check.mjs @@ -0,0 +1,74 @@ +#!/usr/bin/env node +/* ============================================================================ + workflow-secret-check.mjs — PORTÃO QUE NÃO PODE MEDIR NÃO VOTA + ---------------------------------------------------------------------------- + MEDIDO EM 21/08/2026, nos últimos 29 PRs: `classify` vermelho em 11 dos 14 PRs + vindos de FORK e em 0 dos 15 de casa. A causa não era o código de ninguém. + + A regra do GitHub: um workflow disparado por `pull_request`, `pull_request_review` + ou `pull_request_review_comment` a partir de um FORK roda SEM os secrets do + repositório. Só `pull_request_target`, `workflow_dispatch`, `schedule` e + `workflow_run` correm no contexto base e enxergam secret. + + Um job que (a) escuta um desses gatilhos cegos e (b) sai com erro quando o secret + está vazio, reprova todo PR externo por um motivo que o autor não tem como + consertar - e ainda ensina o time a ignorar vermelho, que é o dano caro. + + O QUE ESTA RÉGUA EXIGE: se o job pode ser disparado por gatilho cego, ele precisa + de um `if:` que o exclua desse caso. O guard de secret continua podendo existir e + continuar falhando alto onde o secret DEVERIA estar lá. + + Uso: node tools/eval/workflow-secret-check.mjs [--mutante=] + ============================================================================ */ +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; + +const DIR = '.github/workflows'; +const MUT = (process.argv.find((a) => a.startsWith('--mutante=')) || '').split('=')[1] || ''; +const MUTANTES = { 'guard-sem-if': 'WSEC1', 'gatilho-cego-novo': 'WSEC1' }; +if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } + +/* Gatilhos que, num PR de fork, chegam sem secret. `pull_request` entra na lista + porque é o caso clássico; os outros dois foram os que sangraram aqui. */ +const CEGOS = ['pull_request', 'pull_request_review', 'pull_request_review_comment']; + +const arquivos = readdirSync(DIR).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml')); +const falhas = []; + +for (const nome of arquivos) { + let texto = readFileSync(join(DIR, nome), 'utf8'); + if (MUT === 'guard-sem-if' && nome === 'csbrasil-bot-pr-classify.yml') { + texto = texto.replace(/ if: >-\n( github\.event_name[^\n]*\n)+/, ''); + } + if (MUT === 'gatilho-cego-novo' && nome === 'preview-bot.yml') { + texto = texto.replace(' pull_request_target:', ' pull_request_review:\n types: [submitted]\n pull_request_target:'); + } + + /* O bloco `on:` vai até a primeira chave de topo seguinte (coluna zero). Ler o + arquivo inteiro daria falso positivo com `pull_request` citado em comentário + dentro de um step. */ + const mOn = texto.match(/^on:\n([\s\S]*?)(?=^\S)/m); + if (!mOn) continue; + const bloco = mOn[1]; + const cegos = CEGOS.filter((g) => new RegExp(`^\\s{2}${g}:`, 'm').test(bloco)); + if (!cegos.length) continue; + + /* Guard de secret = o job aborta quando a variável de secret está vazia. */ + const temGuard = /-z "\$GH_TOKEN"|-z "\$\{?[A-Z_]*TOKEN/.test(texto) && /exit 1/.test(texto); + if (!temGuard) continue; + + /* A defesa aceita: um `if:` de job que amarre o event_name ou compare o repo da + head com o repositório - as duas formas de dizer "aqui eu tenho secret". */ + const temDefesa = /if:[\s\S]{0,400}?(github\.event_name\s*==|head\.repo\.full_name\s*==)/.test(texto); + if (!temDefesa) { + falhas.push(`WSEC1 ${nome}: guard de secret + gatilho cego (${cegos.join(', ')}) sem \`if:\` que exclua o caso de fork`); + } +} + +for (const f of falhas) console.log(` \x1b[31m✗\x1b[0m ${f}`); +if (!falhas.length) console.log(` \x1b[32m✓\x1b[0m WSEC1 nenhum portão reprova PR de fork por secret que aquele gatilho não pode ter (${arquivos.length} workflows)`); +if (MUT && !falhas.length) { + console.log(` \x1b[31m✗\x1b[0m MUTAÇÃO '${MUT}' não acendeu nenhuma cláusula — portão cego`); + falhas.push('mutacao-cega'); // prova que não morde é vermelho, não aviso (MC1) +} +process.exit(falhas.length ? 1 : 0); From 8048a60c0683cfcee4d498599f51748bc10ef3db Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:17:54 +0000 Subject: [PATCH 03/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 6 +++--- README.md | 4 ++-- STATUS.md | 2 +- docs/docs/comecando.md | 8 ++++---- docs/docs/quality-gates.md | 2 +- .../docusaurus-plugin-content-docs/current/comecando.md | 8 ++++---- .../current/quality-gates.md | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index 1a05eda02..f1dee4b65 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -10,7 +10,7 @@ Números atuais das zonas, do quality gate e do `package.json`: |---|---|---|---| | `public/` | o **jogo** | 45 arquivos `.js`, 32.554 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 197 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. @@ -25,10 +25,10 @@ Comandos e scripts atuais do quality gate: ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:vietnam eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **121 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. +`package.json` tem **124 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/README.md b/README.md index cb87c62b0..1efd59e87 100644 --- a/README.md +++ b/README.md @@ -44,10 +44,10 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/STATUS.md b/STATUS.md index c7295f061..aa9d0a315 100644 --- a/STATUS.md +++ b/STATUS.md @@ -5,7 +5,7 @@ - **Versão:** `2.0.0-alpha.175` - **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB - **Código do jogo:** 32.554 linhas em 45 módulos JavaScript -- **Automação:** 121 comandos npm, 197 scripts de avaliação e 54 scripts de pipeline +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index ceec78ff0..bb008e9c8 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -49,10 +49,10 @@ esta página envelhecia no primeiro commit — ver | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | | Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.175` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.175` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.176`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` @@ -276,10 +276,10 @@ E os dois quality gates, com a lista exata do que cada um roda — direto do `pa {/* BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` */} ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:vietnam eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` tem **121 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. +`package.json` tem **124 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index a5ab9d591..c0f22a897 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **197 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. +- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 3af9724fc..9ee339c23 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -51,10 +51,10 @@ this page was aging at the very first commit — see | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | | Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 197 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Version | `2.0.0-alpha.175` | `public/js/version.js` and `package.json` (match) | +| Version | `2.0.0-alpha.175` | `public/js/version.js` and `package.json` **DIVERGE** | > Block generated by `node tools/gen-docs.mjs`. Source: `the command in the right column of each row` @@ -278,10 +278,10 @@ And the two gates, with the exact list of what each one runs — straight from ` {/* BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` */} ```bash -npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:vietnam eval:velhooeste eval:penitenciaria eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam +npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:pickuparma eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam ``` -`package.json` has **121 scripts**; the reason behind each one lives in `SCRIPTS.md`. +`package.json` has **124 scripts**; the reason behind each one lives in `SCRIPTS.md`. > Block generated by `node tools/gen-docs.mjs`. Source: `node -p "Object.keys(require('./package.json').scripts)"` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 7673a7059..ef263f297 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **197 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. +- The harness contains **201 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From 06c4b983c275bae33acc2a88340dda3633127da2 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:18:27 +0000 Subject: [PATCH 04/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 4 ++-- README.md | 15 ++++++++------- STATUS.md | 6 +++--- docs/docs/colaborar.md | 2 +- docs/docs/comecando.md | 13 +++++++------ docs/docs/quality-gates.md | 2 +- .../current/colaborar.md | 2 +- .../current/comecando.md | 13 +++++++------ .../current/quality-gates.md | 2 +- 9 files changed, 31 insertions(+), 28 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index e23771a09..f1dee4b65 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -8,9 +8,9 @@ Números atuais das zonas, do quality gate e do `package.json`: | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 44 arquivos `.js`, 32.001 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 45 arquivos `.js`, 32.554 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 200 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 54 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. diff --git a/README.md b/README.md index ac9728f2c..67c332f85 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.176` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index f24bbc7e6..1942408ca 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.176` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index af81d431f..8fa9d86b0 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Emerson Garrido`, `Ruben`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 2136266b1..12e81653e 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.176` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index e1fad825a..c0f22a897 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **200 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. +- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **54 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index 2a6f44d8b..f5e21e013 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Emerson Garrido`, `Ruben`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index b724aaa48..b82c503ef 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 32,554 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.176` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 53b1f97a3..ef263f297 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **200 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. +- The harness contains **201 scripts** in `tools/eval/`, plus **54 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From 2a83a5e977a7fd4de4aa499da7c28bfa4fea44d5 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:19:23 +0000 Subject: [PATCH 05/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 ++-- package.json | 2 +- tools/eval/ARCH.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e25564558..3d6977d77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index 29eebdad5..c574a47b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.176", + "version": "2.0.0-alpha.177", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index e8d932ec1..cb96bc69f 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,7 +3,7 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.176 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.177 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados From 3b5e6351a2bffb472adc87077c23dd3c9edd3c7b Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:19:24 +0000 Subject: [PATCH 06/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- README.md | 2 +- docs/docs/comecando.md | 2 +- .../i18n/en/docusaurus-plugin-content-docs/current/comecando.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 67c332f85..4e60d94b7 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.176` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.176` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.177`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 12e81653e..718e4006c 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -52,7 +52,7 @@ esta página envelhecia no primeiro commit — ver | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.176` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.176` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.177`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index b82c503ef..9f3f11f59 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -54,7 +54,7 @@ this page was aging at the very first commit — see | Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Version | `2.0.0-alpha.176` | `public/js/version.js` and `package.json` (match) | +| Version | `2.0.0-alpha.176` | `public/js/version.js` and `package.json` **DIVERGE** | > Block generated by `node tools/gen-docs.mjs`. Source: `the command in the right column of each row` From c61818cccecb5ba7bc7beb8f7fa26ae8cabfce46 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 04:19:51 +0000 Subject: [PATCH 07/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- README.md | 15 ++++++++------- STATUS.md | 6 +++--- docs/docs/colaborar.md | 5 +++-- docs/docs/comecando.md | 13 +++++++------ .../current/colaborar.md | 5 +++-- .../current/comecando.md | 13 +++++++------ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 391db7ab2..38d40fc1d 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 40aeac98b..4cd73d0f8 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.177` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 2d5b3e074..8fa9d86b0 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 8c9d253c4..ee77bb151 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index ad72a3a1d..f5e21e013 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 888a3d9ae..12f5397fb 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 32,554 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From eb94e5e218841e05077c6c61bd2c794572b68cf7 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:50:16 +0000 Subject: [PATCH 08/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- tools/eval/autofix-check.mjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/eval/autofix-check.mjs b/tools/eval/autofix-check.mjs index ec57c4434..c60da58a7 100644 --- a/tools/eval/autofix-check.mjs +++ b/tools/eval/autofix-check.mjs @@ -17,6 +17,10 @@ workflow pode chamar `gh pr merge`. O `csbrasil-bot-automerge` chamava, e era a única coisa que um bot daqui fazia sozinho — justamente a que não devia. Ele agora aplica `pronto-pra-merge` e o botão continua humano. + AF7 · todo commit que o bot faz carrega os trailers que o CI cobra de humano: + `Agent:` (agente_check) e `Signed-off-by:` (dco_check). Sem eles o bot conserta + o PR e reprova o mesmo PR no passo seguinte - foi o que aconteceu no primeiro + disparo real, em 22/08. AF6 · o autofix acorda quando a MAIN anda, não só quando o PR se mexe. Foram 9 releases em 20 horas e cada um reabre conflito em todo PR aberto; sem o gatilho de push o bot só conserta quem empurra commit — ou seja, nunca @@ -40,6 +44,7 @@ const MUTANTES = { 'automerge-volta': 'AF4', 'resolve-conflito-de-codigo': 'AF5', 'sem-varredura-pos-release': 'AF6', + 'commit-sem-trailer': 'AF7', }; if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } @@ -109,6 +114,14 @@ if (resolveConflito) { } } +/* ---- AF7: os commits do bot levam os trailers que o CI cobra ---- */ +if (MUT === 'commit-sem-trailer') wf = wf.replace(/\n\s*-m "Agent: csbrasil-bot \(autofix\)" \\/g, ''); +const commits = [...wf.matchAll(/git commit[\s\S]{0,600}?(?=\n\s{0,10}[a-z-]+:|\n\s*$)/g)].map((m) => m[0]); +for (const c of commits) { + if (!/Agent:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva o trailer `Agent:` — o agente_check reprova o PR que ele acabou de consertar'); + if (!/Signed-off-by:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva `Signed-off-by:` — o dco reprova o PR que ele acabou de consertar'); +} + /* ---- AF6: a varredura pós-release existe e enxerga quem ficou para trás ---- */ if (MUT === 'sem-varredura-pos-release') wf = wf.replace(/\n push:\n branches: \[main\]/, ''); const temPush = /^\s{2}push:\n\s{4}branches: \[main\]/m.test(wf); From 2fb1719b399128399c5d19ad1eb176e69cb0f4e5 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:51:52 +0000 Subject: [PATCH 09/21] =?UTF-8?q?Merge=20da=20base=20(conflito=20s=C3=B3?= =?UTF-8?q?=20em=20arquivo=20gerado,=20resolvido=20pelo=20autofix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- package-lock.json | 4 ++-- package.json | 2 +- tools/eval/ARCH.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d6977d77..30c2652b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "license": "AGPL-3.0-only", "dependencies": { "@astrojs/vercel": "^11.0.6", diff --git a/package.json b/package.json index c574a47b5..efd435237 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coro-solto", - "version": "2.0.0-alpha.177", + "version": "2.0.0-alpha.178", "license": "AGPL-3.0-only", "description": "CORO SOLTO: Treta Suprema (ex-CS BRASIL) — FPS satírico de navegador com 5 facções brasileiras (site Astro + jogo vanilla em Three.js), gerado em par com agentes de IA (AI generated & AI friendly)", "scripts": { diff --git a/tools/eval/ARCH.md b/tools/eval/ARCH.md index cb96bc69f..d1020873f 100644 --- a/tools/eval/ARCH.md +++ b/tools/eval/ARCH.md @@ -3,7 +3,7 @@ > Gerado por `node tools/gen-arch.mjs`. **Não edite este bloco à mão.** -> Versão do jogo: 2.0.0-alpha.177 · `npm run arch` para regenerar · `npm run arch:check` no CI. +> Versão do jogo: 2.0.0-alpha.178 · `npm run arch` para regenerar · `npm run arch:check` no CI. ## Tamanho dos arquivos indexados From bdf306587c0022dd82becf70b3c354e56ed0b8cf Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:51:54 +0000 Subject: [PATCH 10/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- README.md | 2 +- docs/docs/comecando.md | 2 +- .../i18n/en/docusaurus-plugin-content-docs/current/comecando.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 38d40fc1d..ee54a32b3 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.177` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.178`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index ee77bb151..c53ef3303 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -52,7 +52,7 @@ esta página envelhecia no primeiro commit — ver | Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Versão | `2.0.0-alpha.177` | `public/js/version.js` e `package.json` (batem) | +| Versão | `2.0.0-alpha.177` | `public/js/version.js` — **DIVERGE do `package.json`: `2.0.0-alpha.178`** | > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `o comando da coluna direita de cada linha` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 12f5397fb..553b373ad 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -54,7 +54,7 @@ this page was aging at the very first commit — see | Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | -| Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` (match) | +| Version | `2.0.0-alpha.177` | `public/js/version.js` and `package.json` **DIVERGE** | > Block generated by `node tools/gen-docs.mjs`. Source: `the command in the right column of each row` From 0ade41961477ef45fcffc055e177d579cf68755f Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 05:52:30 +0000 Subject: [PATCH 11/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- README.md | 15 ++++++++------- STATUS.md | 6 +++--- docs/docs/comecando.md | 13 +++++++------ .../current/comecando.md | 13 +++++++------ 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index f24151e75..c37d19073 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.178` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index d811ae59d..bfa41c48c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.178` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 60a11d299..10da25daa 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.178` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 18eac13ad..aebb668ef 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 32,554 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 200 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 54 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.178` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From f54376e023673e43471bff89763a3756aae2812d Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 07:12:04 +0000 Subject: [PATCH 12/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 93c643885..d3b507eb1 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.179` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From d052a208bdeefd761675ce5c65d62dff641d6ee9 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 20:58:18 +0000 Subject: [PATCH 13/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index f4837dea7..0b7e475bd 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.180` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 200 scripts de avaliação e 54 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 201 scripts de avaliação e 54 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 3c552e04486e711bdd06dda5ae68f151adb2208d Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:13:45 +0000 Subject: [PATCH 14/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- ARCH.generated.md | 4 ++-- README.md | 15 ++++++++------- STATUS.md | 6 +++--- docs/docs/comecando.md | 13 +++++++------ docs/docs/quality-gates.md | 2 +- .../current/comecando.md | 13 +++++++------ .../current/quality-gates.md | 2 +- 7 files changed, 29 insertions(+), 26 deletions(-) diff --git a/ARCH.generated.md b/ARCH.generated.md index 725b84f0c..0c860d7ae 100644 --- a/ARCH.generated.md +++ b/ARCH.generated.md @@ -8,9 +8,9 @@ Números atuais das zonas, do quality gate e do `package.json`: | Zona | O que é | Tamanho medido | Regra | |---|---|---|---| -| `public/` | o **jogo** | 44 arquivos `.js`, 32.001 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | +| `public/` | o **jogo** | 45 arquivos `.js`, 32.554 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime | | `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor | -| `tools/` | o **arnês** | 201 scripts em `tools/eval/`, 55 em `tools/` | node puro: sobe o jogo real sem browser | +| `tools/` | o **arnês** | 202 scripts em `tools/eval/`, 55 em `tools/` | node puro: sobe o jogo real sem browser | **Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo. diff --git a/README.md b/README.md index 182647bda..a957ee57f 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro. | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.180` | `public/js/version.js` e `package.json` (batem) | @@ -89,7 +89,7 @@ arquitetura): `cd docs && npm install && npm start` → Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/STATUS.md b/STATUS.md index 1678591de..52920c886 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.180` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/comecando.md b/docs/docs/comecando.md index 476fa7596..4f772160d 100644 --- a/docs/docs/comecando.md +++ b/docs/docs/comecando.md @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver | O que | Quanto | Onde confere | |---|---:|---| -| Código do jogo | 32.001 linhas em 44 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | +| Código do jogo | 32.554 linhas em 45 arquivos | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6.910** linhas | `wc -l public/js/game.js` | -| `main.js` | 2.698 linhas | `wc -l public/js/main.js` | +| `main.js` | 2.702 linhas | `wc -l public/js/main.js` | | Armas com GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | GLBs de personagem | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props em GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Clipes de animação versionados | 573 | `git ls-files public/models/anims \| wc -l` | | Personagens jogáveis | 44, em 5 facções | array `CHARACTERS` de `characters.js` | -| Mapas no registro | 12 | objeto `MAPS` de `maps.js` | +| Mapas no registro | 13 | objeto `MAPS` de `maps.js` | | Arnêses visuais em HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Scripts do arnês | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Scripts do arnês | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Scripts de pipeline | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Versão | `2.0.0-alpha.180` | `public/js/version.js` e `package.json` (batem) | @@ -66,7 +66,7 @@ E as regras de partida que mais mudam de lugar, todas lidas das constantes de | Regra | Valor | Constante | |---|---|---| | Facções · personagens | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Mapas no menu | 12 — 2 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | +| Mapas no menu | 13 — 3 abrem em rodadas, **10 em captura** | `MAPS` / `ctfMode` | | Respawn | 2,2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 vitórias | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Captura | alvo = **todas as bandeiras do mapa**, 2 rodadas (rede de segurança 480 s) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -233,8 +233,9 @@ Os mapas registrados hoje, e em que modo cada um abre: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/docs/quality-gates.md b/docs/docs/quality-gates.md index d802c0845..e76544e9d 100644 --- a/docs/docs/quality-gates.md +++ b/docs/docs/quality-gates.md @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2.275 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado. -- O arnês inteiro são **201 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **55 scripts** de pipeline em `tools/`. +- O arnês inteiro são **202 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **55 scripts** de pipeline em `tools/`. - Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real. Reproduza: diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md index 72fb351e4..bcf16090a 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md @@ -41,17 +41,17 @@ this page was aging at the very first commit — see | What | How much | Where to check | |---|---:|---| -| Game code | 32,001 lines in 44 files | `git ls-files public/js/*.js \| xargs wc -l` | +| Game code | 32,554 lines in 45 files | `git ls-files public/js/*.js \| xargs wc -l` | | `game.js` | **6,910** lines | `wc -l public/js/game.js` | -| `main.js` | 2,698 lines | `wc -l public/js/main.js` | +| `main.js` | 2,702 lines | `wc -l public/js/main.js` | | Weapons with GLB | 26 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` | | Character GLBs | 45 | `git ls-files 'public/models/characters/*.glb' \| wc -l` | | Props in GLB | 108 | `git ls-files 'public/models/props/*.glb' \| wc -l` | | Versioned animation clips | 573 | `git ls-files public/models/anims \| wc -l` | | Playable characters | 44, in 5 factions | `CHARACTERS` array in `characters.js` | -| Maps in the registry | 12 | `MAPS` object in `maps.js` | +| Maps in the registry | 13 | `MAPS` object in `maps.js` | | Visual harnesses in HTML | 15 | `git ls-files 'public/*.html' \| wc -l` | -| Harness scripts | 201 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | +| Harness scripts | 202 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` | | Pipeline scripts | 55 | `git ls-files 'tools/*.mjs' \| wc -l` | | Written entry tasks | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` | | Version | `2.0.0-alpha.180` | `public/js/version.js` and `package.json` (match) | @@ -68,7 +68,7 @@ And the match rules that move around the most, all read from the constants in | Rule | Value | Constant | |---|---|---| | Factions · characters | 5 · 44 (B 9 · C 9 · E 8 · F 9 · U 9) | `CHARACTERS` | -| Maps in the menu | 12 - 2 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | +| Maps in the menu | 13 - 3 open in rounds, **10 in capture** | `MAPS` / `ctfMode` | | Respawn | 2.2 s | `RESPAWN_DELAY` | | Round | 99 s, 3 wins | `ROUND_TIME` / `ROUNDS_TO_WIN` | | Capture | target = **all flags on the map**, 2 rounds (480 s safety net) | `capsToWin = ctfPts.length` / `CTF_ROUNDS_TO_WIN` | @@ -235,8 +235,9 @@ The maps registered today, and which mode each one opens in: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md index 2a6ea015a..b56f29e01 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md @@ -18,7 +18,7 @@ PR (`.github/workflows/ci.yml`). {/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */} - `tools/eval/invariants.mjs`: **2,275 lines**, **65 declared invariant identifiers**, with **28** declared `skip()` paths. -- The harness contains **201 scripts** in `tools/eval/`, plus **55 pipeline scripts** in `tools/`. +- The harness contains **202 scripts** in `tools/eval/`, plus **55 pipeline scripts** in `tools/`. - The number of critical checks in one run depends on the inputs present on that machine; dated results belong in `KNOWN-BUGS.md`. ```bash From b5e58efd19f2f47e84afce5521697ab6562ecb08 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:15:23 +0000 Subject: [PATCH 15/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 290f742d2..726f30a3c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.181` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 1492f73e68e478215098097e0e486ebc6ca6c00f Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sat, 22 Aug 2026 21:35:10 +0000 Subject: [PATCH 16/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index c8355808a..e866d747a 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.182` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 4beb947ddc160784479c9f9bd5ab0fff4215dff4 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Sun, 23 Aug 2026 22:21:53 +0000 Subject: [PATCH 17/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index c90fa4ff1..ad9b945a2 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.183` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 018b2af26dd8bc143d42200c31572045eab574bb Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Mon, 24 Aug 2026 17:47:57 +0000 Subject: [PATCH 18/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index cdef2610e..c41068853 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.184` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` From 8399d07e7d166291797b8ddc2e1cf4fbc9369f6b Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:20:58 +0000 Subject: [PATCH 19/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- docs/docs/colaborar.md | 5 +++-- .../en/docusaurus-plugin-content-docs/current/colaborar.md | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index e8008507e..8fa9d86b0 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `nunreasonable`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index e6f135e39..f5e21e013 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `nunreasonable`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From 84b859b73ef1b7530e599fb345d9d47befaea5e9 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:21:51 +0000 Subject: [PATCH 20/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- docs/docs/colaborar.md | 5 +++-- .../en/docusaurus-plugin-content-docs/current/colaborar.md | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/STATUS.md b/STATUS.md index cf5d7b7a5..c0ee54db0 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.185` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/` diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 2d5b3e074..8fa9d86b0 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**12 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -260,8 +260,9 @@ O registro, gerado do `MAPS` de `public/js/maps.js`: | `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rodadas | `map_treta_vietnan.js` | 547 | -**12 mapas registrados** — 2 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 14 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. +**13 mapas registrados** — 3 abrem em rodadas e 10 em captura. `ctfMode` **abre** o mapa em captura, não prende: o jogador troca no menu (é a `MOD1`). Há 15 arquivos `map_*.js` em `public/js/` — arquivo no disco **não** implica mapa jogável. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `objeto MAPS de public/js/maps.js` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index ad72a3a1d..f5e21e013 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**12 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`, `usantos`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` @@ -263,8 +263,9 @@ The registry, generated from the `MAPS` of `public/js/maps.js`: | `parque_treta` | Parque da Treta | **capture** | `map_parque.js` | 402 | | `velho_oeste` | Velho Oeste da Treta | **capture** | `map_velho_oeste.js` | 433 | | `penitenciaria` | Penitenciária da Treta | **capture** | `map_penitenciaria.js` | 247 | +| `treta_vietnan` | Treta no Vietnã | rounds | `map_treta_vietnan.js` | 547 | -**12 registered maps** - 2 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 14 `map_*.js` files on disk, so a file alone does **not** make a map playable. +**13 registered maps** - 3 open in rounds and 10 in capture. `ctfMode` sets the initial mode; it does not lock it. There are 15 `map_*.js` files on disk, so a file alone does **not** make a map playable. > Block generated by `node tools/gen-docs.mjs`. Source: `objeto MAPS de public/js/maps.js` From 2da3ffbffbe59809546c082d61db03edb8759d44 Mon Sep 17 00:00:00 2001 From: csbrasil-bot Date: Wed, 26 Aug 2026 03:43:31 +0000 Subject: [PATCH 21/21] chore(docs): regenera bloco derivado (autofix) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot --- STATUS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STATUS.md b/STATUS.md index 02b49e34b..72ec50cd7 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,9 +3,9 @@ - **Versão:** `2.0.0-alpha.186` -- **Conteúdo jogável:** 5 facções, 44 personagens, 12 mapas e 26 armas com GLB -- **Código do jogo:** 32.001 linhas em 44 módulos JavaScript -- **Automação:** 124 comandos npm, 201 scripts de avaliação e 55 scripts de pipeline +- **Conteúdo jogável:** 5 facções, 44 personagens, 13 mapas e 26 armas com GLB +- **Código do jogo:** 32.554 linhas em 45 módulos JavaScript +- **Automação:** 124 comandos npm, 202 scripts de avaliação e 55 scripts de pipeline > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/`