<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://omp.itsneufox.com/pt-BR/blog</id>
    <title>open.mp Blog</title>
    <updated>2025-02-12T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://omp.itsneufox.com/pt-BR/blog"/>
    <subtitle>open.mp Blog</subtitle>
    <icon>https://omp.itsneufox.com/pt-BR/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Falso positivo do Windows Defender no Launcher]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/launcher-false-positive</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/launcher-false-positive"/>
        <updated>2025-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Alguns usuários relataram que o Windows Defender está sinalizando o open.mp Launcher como um Trojan/vírus. Isso é um falso positivo; o launcher é completamente seguro para uso.]]></summary>
        <content type="html"><![CDATA[<p>Alguns usuários relataram que o <strong>Windows Defender está sinalizando o open.mp Launcher como um Trojan/vírus</strong>. Isso é um <strong>falso positivo</strong>; o launcher é completamente seguro para uso.</p>
<p>O launcher é <strong>totalmente open source</strong> e você pode revisá-lo ou compilá-lo por conta própria:
<a href="https://github.com/openmultiplayer/launcher" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/launcher</a></p>
<p>Nós <strong>já estamos trabalhando para corrigir isso</strong>, para que builds futuras não sejam sinalizadas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-que-fazer-por-enquanto">O que fazer por enquanto<a href="https://omp.itsneufox.com/pt-BR/blog/launcher-false-positive#o-que-fazer-por-enquanto" class="hash-link" aria-label="Link direto para O que fazer por enquanto" title="Link direto para O que fazer por enquanto" translate="no">​</a></h2>
<p>Até que a Microsoft atualize suas assinaturas de detecção, adicione a pasta do launcher como uma exclusão no Windows Defender:</p>
<ol>
<li class="">Abra a <strong>Segurança do Windows</strong> (procure por ela no menu Iniciar)</li>
<li class="">Vá para <strong>Proteção contra vírus e ameaças</strong></li>
<li class="">Em <strong>Configurações de proteção contra vírus e ameaças</strong>, clique em <strong>Gerenciar configurações</strong></li>
<li class="">Role para baixo até <strong>Exclusões</strong> e clique em <strong>Adicionar ou remover exclusões</strong></li>
<li class="">Clique em <strong>Adicionar uma exclusão</strong> → <strong>Pasta</strong></li>
<li class="">Selecione sua <strong>pasta de instalação do open.mp launcher</strong> e confirme</li>
<li class="">Feche e reabra o launcher</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="observações">Observações<a href="https://omp.itsneufox.com/pt-BR/blog/launcher-false-positive#observa%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para Observações" title="Link direto para Observações" translate="no">​</a></h3>
<ul>
<li class="">Exclua a <strong>pasta inteira do launcher</strong>, não arquivos individuais, porque os hashes dos arquivos mudam entre atualizações.</li>
<li class="">Se o Defender ainda mostrar um aviso depois de adicionar a exclusão, feche completamente o launcher, verifique novamente o caminho da exclusão e tente de novo.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="por-que-isso-acontece">Por que isso acontece?<a href="https://omp.itsneufox.com/pt-BR/blog/launcher-false-positive#por-que-isso-acontece" class="hash-link" aria-label="Link direto para Por que isso acontece?" title="Link direto para Por que isso acontece?" translate="no">​</a></h2>
<p>Falsos positivos são comuns em softwares relacionados a jogos. Heurísticas de antivírus podem sinalizar programas legítimos que interagem com processos de jogos. Estamos trabalhando com a Microsoft para que o launcher seja colocado corretamente na lista de permissões.</p>
<p>Ainda tem dúvidas? Entre em contato pelo nosso <a href="https://discord.gg/samp" target="_blank" rel="noopener noreferrer" class="">Discord</a>.</p>]]></content>
        <author>
            <name>iAmir</name>
        </author>
        <author>
            <name>itsneufox</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Portando para open.mp]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/porting</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/porting"/>
        <updated>2024-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[O SA:MP ficou preso no limbo por anos, sem atualizações e com várias gambiarras só para manter as coisas funcionando. O open.mp muda isso — é uma reescrita completa que corrige problemas antigos, melhora o scripting e remove limites antigos, mantendo seu código existente funcionando. Mas o que isso realmente significa para você? Vamos explicar.]]></summary>
        <content type="html"><![CDATA[<p>O SA<!-- -->:MP<!-- --> ficou preso no limbo por anos, sem atualizações e com várias gambiarras só para manter as coisas funcionando. O open.mp muda isso — é uma reescrita completa que corrige problemas antigos, melhora o scripting e remove limites antigos, mantendo seu código existente funcionando. Mas o que isso realmente significa para você? Vamos explicar.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>aviso</div><div class="admonitionContent_BuS1"><p>O conteúdo do post a seguir está desatualizado e, em sua maioria, não tem relação com o estado atual do open.mp. O post está publicado aqui para fins de arquivo.</p></div></div>
<p>Já estava claro há muito tempo que Kalcor não tinha mais interesse em manter o SA<!-- -->:MP<!-- -->; o que, por si só, tudo bem, mas como ele era a única pessoa com acesso oficial ao código-fonte, isso o transformou em um gargalo para novas atualizações. Tanto YSF quanto fixes.inc foram criados para preencher esse vazio — corrigir bugs e inconsistências no servidor sem ter acesso ao código-fonte; o primeiro como plugin e o segundo como include. Apesar de esforços monumentais para tornar esses (e outros) projetos tão estáveis, abrangentes e fáceis de usar quanto possível, eles naturalmente começaram a atingir seus limites e uma nova geração de correções se tornou necessária. É aí que o open.mp entra.</p>
<p>Fundado nos mesmos princípios, e aproveitando todas as inúmeras melhorias desenvolvidas pela comunidade ao longo de uma década, o open.mp é uma reescrita do zero do servidor SA<!-- -->:MP<!-- --> original, com todas as correções de seus predecessores diretos e muitas outras que eram impraticáveis ou simplesmente impossíveis. É verdade que essa abordagem não veio sem controvérsia — alguns servidores desenvolveram seus próprios métodos privados para lidar com as peculiaridades do SA<!-- -->:MP<!-- -->, independentemente dos esforços da comunidade, mas essas não são técnicas que todo scripter deveria ter que desenvolver por conta própria, e este artigo ajudará na portabilidade de código existente.</p>
<p>Esperamos abordar os principais pontos problemáticos, mas se houver algum que deixarmos passar, fique à vontade para entrar em contato via discord ou github e teremos prazer em corrigir o guia.</p>
<p>A alternativa é desfazer as correções usando uma biblioteca que é a gêmea da fixes.inc: breaks.inc:</p>
<p><a href="https://github.com/pawn-lang/sa-mp-fixes/blob/master/breaks.inc" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/sa-mp-fixes/blob/master/breaks.inc</a></p>
<p>Então fique à vontade para instalá-la e reverter para todos os comportamentos antigos de forma transparente por meio de hooks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tags"><code>Tags</code><a href="https://omp.itsneufox.com/pt-BR/blog/porting#tags" class="hash-link" aria-label="Link direto para tags" title="Link direto para tags" translate="no">​</a></h2>
<p>Os includes do open.mp adicionam muitas novas tags às funções, embora ainda tentem encontrar um equilíbrio entre upgrades muito necessários e invasividade. Como essas mudanças podem ser muito amplas, escrevemos uma ferramenta para automatizar boa parte disso:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hidemenuforplayer"><code>HideMenuForPlayer</code><a href="https://omp.itsneufox.com/pt-BR/blog/porting#hidemenuforplayer" class="hash-link" aria-label="Link direto para hidemenuforplayer" title="Link direto para hidemenuforplayer" translate="no">​</a></h2>
<p>Esta função sempre recebeu um parâmetro de ID de menu, mas no SA<!-- -->:MP<!-- --> esse ID não era usado. Então, qualquer que fosse o valor fornecido, o menu atual do jogador era fechado, mesmo que ele não estivesse olhando para aquele que você disse para fechar.</p>
<p>Código antigo poderia ser assim:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gShopMenu </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CreateMenu</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">HideMenuForPlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gShopMenu</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Isso sempre fecharia o menu atual do jogador, independentemente de qual ele estivesse realmente vendo. Agora você precisará lembrar qual menu ele está vendo, ou simplesmente obtê-lo:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gShopMenu </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CreateMenu</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">HideMenuForPlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">GetPlayerMenu</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setplayerattachedobject"><code>SetPlayerAttachedObject</code><a href="https://omp.itsneufox.com/pt-BR/blog/porting#setplayerattachedobject" class="hash-link" aria-label="Link direto para setplayerattachedobject" title="Link direto para setplayerattachedobject" translate="no">​</a></h2>
<p>Objetos anexados no SA<!-- -->:MP<!-- --> sobreviviam a uma mudança de gamemode, mas no open.mp eles não sobrevivem. Se você quiser que um jogador mantenha seus objetos após um reinício do modo, terá que adicioná-los novamente em <code>OnPlayerConnect</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token class-name">E_ATTACHMENT_DATA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_MODEL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_BONE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_OFFSET_X</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_OFFSET_Y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_OFFSET_Z</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_ROT_X</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_ROT_Y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_ROT_Z</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_SCALE_X</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_SCALE_Y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_SCALE_Z</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_COLOUR_1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    E_ATTACHMENT_DATA_COLOUR_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">public </span><span class="token function" style="color:#d73a49">OnPlayerConnect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">new i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> MAX_OBJECT_ATTACHMENT_SLOTS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">++</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">SetPlayerAttachedObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_MODEL</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_BONE</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_OFFSET_X</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_OFFSET_Y</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_OFFSET_Z</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_ROT_X</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_ROT_Y</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_ROT_Z</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_SCALE_X</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_SCALE_Y</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_SCALE_Z</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_COLOUR_1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            gAttachementData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">E_ATTACHMENT_DATA_COLOUR_2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dinheiro-ao-morrer">Dinheiro ao morrer<a href="https://omp.itsneufox.com/pt-BR/blog/porting#dinheiro-ao-morrer" class="hash-link" aria-label="Link direto para Dinheiro ao morrer" title="Link direto para Dinheiro ao morrer" translate="no">​</a></h2>
<p>Quando um jogador morre em San Andreas, $100 são deduzidos dele automaticamente para cobrir as contas do hospital. Esse recurso permanece no SA<!-- -->:MP<!-- -->, mas foi removido do open.mp para permitir que scripts gerenciem todo o próprio dinheiro. Vários scripts já tentam corrigir isso adicionando $100 a um jogador depois da morte, ou ao nascer. Se esse for o seu script, simplesmente remova a correção adicional, embora o código no open.mp tente levar em conta scripts que fazem isso. Se seu script dependia desse recurso, basta adicionar o seguinte código em <code>OnPlayerDeath</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">GivePlayerMoney</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="game-texts">Game texts<a href="https://omp.itsneufox.com/pt-BR/blog/porting#game-texts" class="hash-link" aria-label="Link direto para Game texts" title="Link direto para Game texts" translate="no">​</a></h2>
<p>O SA<!-- -->:MP<!-- --> tem seis estilos diferentes de game text, mas vários deles são basicamente inutilizáveis. Um fica aparecendo e desaparecendo constantemente, um desaparece após um tempo definido independentemente do tempo que você colocou, e um nunca desaparece independentemente do tempo selecionado. No entanto, descobriu-se que todos esses estilos de game text podem ser reproduzidos com precisão<sup><a href="https://omp.itsneufox.com/pt-BR/blog/porting#user-content-fn-1-21f06c" id="user-content-fnref-1-21f06c" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup> usando text draws. Assim, fixes.inc e, posteriormente, open.mp fizeram isso. A aparência dos game texts é a mesma de antes, com a vantagem de que todos os estilos são utilizáveis, e a desvantagem de que eles não fazem mais fade in e fade out.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">FadingGameTextForPlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> format</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> style</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">style </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Não há versão com fade desses estilos.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">GameTextForPlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> format</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> style</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Envia uma mensagem bruta via Pawn.RakNet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tamanhos-dos-pools">Tamanhos dos pools<a href="https://omp.itsneufox.com/pt-BR/blog/porting#tamanhos-dos-pools" class="hash-link" aria-label="Link direto para Tamanhos dos pools" title="Link direto para Tamanhos dos pools" translate="no">​</a></h2>
<p><code>GetPlayerPoolSize</code>, <code>GetActorPoolSize</code> e <code>GetVehiclePoolSize</code> eram um tanto sem sentido quando foram introduzidas pela primeira vez; retornavam o maior ID conectado, que não tem relação com o número de jogadores conectados, e chegaram muito depois de métodos de loop muito melhores já existirem. Ser meio bobo não é, por si só, motivo para remover as funções, mas infelizmente elas também estão quebradas e retornam dados incorretos quando não há jogadores conectados. Não há como corrigir esses valores de retorno de uma forma que seja ao mesmo tempo retrocompatível e correta daqui para frente (acredite, tentamos). Diante desses fatos, optamos por simplesmente remover as funções. Use apenas um loop normal ou <code>foreach</code>:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">new i </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Player</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Alguns scripts travaram quando essa mudança foi introduzida, mas apenas ao usar a seguinte forma de loop:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">new i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetPlayerPoolSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">++</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Embora, como o maior valor é um jogador real quando há pessoas online, esse código esteja errado de qualquer forma — ele deixa uma pessoa de fora.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="grafias">Grafias<a href="https://omp.itsneufox.com/pt-BR/blog/porting#grafias" class="hash-link" aria-label="Link direto para Grafias" title="Link direto para Grafias" translate="no">​</a></h2>
<p>O SA<!-- -->:MP<!-- --> é muito inconsistente nas grafias usadas no código — algumas coisas usam inglês britânico, outras usam americano:</p>
<ul>
<li class=""><code>Bumper</code> - Britânico</li>
<li class=""><code>Hood</code> - Americano</li>
<li class=""><code>Armour</code> - Britânico</li>
<li class=""><code>Stereo</code> - Americano</li>
</ul>
<p>Unificamos isso e adotamos as grafias britânicas. Então, por exemplo:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">TextDrawBoxColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">textid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> boxColor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Agora é:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">TextDrawBoxColour</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">textid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> boxColour</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>A ferramenta de upgrade cuidará automaticamente da maioria desses casos.</p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://omp.itsneufox.com/pt-BR/blog/porting#footnote-label" class="hash-link" aria-label="Link direto para Footnotes" title="Link direto para Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-21f06c">
<p>Com uma exceção notável: o novo estilo de game text de relógio. Por algum motivo desconhecido, a cor do relógio é diferente para pessoas diferentes, o que levou a muita discussão sobre a melhor forma de replicar esse estilo até que a discrepância fosse encontrada. Tivemos que escolher uma das duas por consistência. <a href="https://omp.itsneufox.com/pt-BR/blog/porting#user-content-fnref-1-21f06c" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Y_Less</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Release Candidate 1]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/release-candidate-1</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1"/>
        <updated>2023-01-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Finalmente chegou! 🎉 Depois de anos de desenvolvimento, reescritas e desafios, estamos empolgados em apresentar o Release Candidate 1 (RC1) do servidor open.mp. Isso marca um grande passo rumo ao nosso lançamento oficial 1.0, trazendo atualizações, recursos e melhorias significativas.]]></summary>
        <content type="html"><![CDATA[<p>Finalmente chegou! 🎉 Depois de anos de desenvolvimento, reescritas e desafios, estamos empolgados em apresentar o Release Candidate 1 (RC1) do servidor open.mp. Isso marca um grande passo rumo ao nosso lançamento oficial 1.0, trazendo atualizações, recursos e melhorias significativas.</p>
<p>Chegou!</p>
<p>Finalmente chegou!</p>
<p>Depois de quatro anos, duas reescritas, discussões e drama, e incontáveis outros obstáculos; finalmente chegou!</p>
<p>Release Candidate 1 (RC1) do servidor open.mp.</p>
<p>Isso, esperamos, representa a versão final do código para o nosso lançamento 1.0, e se tudo correr bem com esta versão poderemos finalmente <strong>abrir</strong> o chamado <strong>open</strong>.mp em apenas alguns dias a partir de agora.</p>
<p>Antes de entrar na parte principal do lançamento, quero primeiro agradecer sinceramente a cada membro da equipe open.mp por ajudar o mod a chegar tão longe. Não foi fácil, principalmente pelo quanto todos estavam realmente envolvidos - todos queríamos o melhor para o mod, para a comunidade, para o SA<!-- -->:MP<!-- -->, para nossos servidores e para nossos jogadores; não teríamos embarcado nessa jornada se não fosse assim. Infelizmente, opiniões fortes e divergentes sobre o que é <strong>melhor</strong> às vezes causam atrito. Mas estamos aqui agora. Então, a todos, um enorme obrigado:</p>
<ul>
<li class="">Amir</li>
<li class="">Cheaterman</li>
<li class="">Freaksken</li>
<li class="">Graber</li>
<li class="">Hual</li>
<li class="">Josh</li>
<li class="">JustMichael</li>
<li class="">kseny</li>
<li class="">Nexius</li>
<li class="">pkfin</li>
<li class="">Potassium</li>
<li class="">Southclaws</li>
<li class="">TommyB</li>
<li class="">Y_Less</li>
<li class="">Zeex</li>
<li class="">E provavelmente mais...</li>
</ul>
<p>Enfim, agora a parte com a qual você realmente se importa...</p>
<p>Agora que saímos do beta, estamos (se tudo correr bem esta semana) lançando no prazo. Então, junto com o próprio servidor, que você já viu uma dúzia de vezes antes, temos algumas novidades para vocês:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pawn">Pawn<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#pawn" class="hash-link" aria-label="Link direto para Pawn" title="Link direto para Pawn" translate="no">​</a></h2>
<p>O download tem os includes oficiais, sem mais corrigir os includes antigos do SA<!-- -->:MP<!-- --> com <code>omp.inc</code>; agora estamos fazendo isso direito! Ele também tem um novo compilador. Já se perguntou quando a 3.10.11 chegaria? Bem, não espere mais (se você mesmo a compilou, pode pensar nesta como 3.10.12)! Com essa combinação, você provavelmente receberá muitos novos avisos, mas não se preocupe - também temos uma ferramenta para isso, para atualizar automaticamente uma boa quantidade de código, adicionando nomes de símbolos bem definidos, <code>const</code> e mais nos lugares certos. Talvez você já tenha notado isso, já vem usando há meses, mas a máquina virtual (a parte dentro do servidor) também foi atualizada! Ah, e todas aquelas natives de string que você conhece e adora, como <code>SendClientMessage</code> e <code>AddMenuItem</code>? Agora todas elas formatam. Todas elas<sup><a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#user-content-fn-1-551b0c" id="user-content-fnref-1-551b0c" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>.</p>
<p>Uma lista completa do que está disponível:</p>
<ul>
<li class="">Limite de tamanho de símbolo aumentado para 64, sem mais <code>OnPlyrDoTheTing</code> para tentar encaixar seus nomes. Levando a...</li>
<li class="">Várias natives descomprimidas - <code>Col</code> é abreviação de <code>Colour</code> ou <code>Collision</code>? Agora você sabe!</li>
<li class="">Tags. Tags em todos os lugares. Veja a documentação incluída.</li>
<li class="">Os includes oficiais finalmente estão const-correct. Sem mais reclamações de que algumas pessoas talvez não os tenham.</li>
<li class="">Versão do compilador atualizada: <code>__nameof</code>, <code>__addressof</code>, correções e coisas demais para listar aqui.</li>
<li class=""><code>switch</code> está muito mais rápido.</li>
<li class="">Mais avisos para problemas anteriormente não detectados. Quanto mais problemas o compilador puder encontrar, menos você precisa encontrar.</li>
<li class="">Uma ferramenta <em>upgrader</em> para adicionar tags e <code>const</code> ao código do usuário e corrigir vários novos avisos.</li>
<li class="">Nomenclatura mais consistente. Cada native foi examinada de perto e comparada para garantir o máximo nível de similaridade e intuitividade na nomenclatura.</li>
<li class="">Adicionado <code>{Float, _}:...</code> em todos os lugares. O que isso significa? Significa quase não precisar mais de <code>format()</code><sup><a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#user-content-fn-2-551b0c" id="user-content-fnref-2-551b0c" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">2</a></sup> - pense em y_va, mas nativamente.</li>
<li class=""><code>-O2</code>, o nível mais alto de otimização do pawn, funciona ao usar o novo compilador e a nova VM. Alguns includes podem precisar ser atualizados, mas alguns já foram. Para ajudar nisso...</li>
<li class="">A macro <code>__optimisation</code> foi adicionada para que o código possa se configurar quando compilado com -O2.</li>
</ul>
<p>Documentação dos includes atualizados:<br>
<a href="https://github.com/openmultiplayer/omp-stdlib" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/omp-stdlib</a></p>
<p>Documentação do novo compilador:<br>
<a href="https://github.com/openmultiplayer/compiler/" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/compiler/</a><br>
<a href="https://github.com/pawn-lang/compiler/" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/compiler/</a></p>
<p>Documentação do qawno:<br>
<a href="https://github.com/openmultiplayer/qawno/" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/qawno/</a></p>
<p>Documentação da ferramenta upgrader:<br>
<a href="https://github.com/openmultiplayer/upgrade" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/upgrade</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk">SDK<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#sdk" class="hash-link" aria-label="Link direto para SDK" title="Link direto para SDK" translate="no">​</a></h2>
<p>Pawn é a forma tradicional, e ainda oficial, de escrever modes para o seu servidor. Ela não vai desaparecer, mas para aqueles de vocês que querem mais controle, estamos finalmente lançando o SDK completo (o <em>S</em>oftware <em>D</em>evelopment <em>K</em>it). Esta é uma interface C++ para o servidor, a mesma usada por todos os componentes que compõem o código principal do open.mp. Qualquer coisa que eles possam fazer, você também pode fazer (comparado a plugins, que foram projetados apenas para fornecer funções ao pawn, não para escrever modes).</p>
<p>Temos alguma documentação em andamento; infelizmente isso leva tempo. Mas enquanto isso, aqui estão vários componentes de exemplo para aqueles de vocês que querem mergulhar direto. Todos são templates nos quais você pode se basear, e vão de basicamente nada até um componente totalmente funcional com os recursos mais comuns:</p>
<p><a href="https://github.com/openmultiplayer/empty-template" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/empty-template</a><br>
<a href="https://github.com/openmultiplayer/basic-template" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/basic-template</a><br>
<a href="https://github.com/openmultiplayer/pawn-template" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/pawn-template</a><br>
<a href="https://github.com/openmultiplayer/full-template" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/full-template</a></p>
<p>Alguns termos para você começar, para que possa entender o que está lendo:</p>
<ul>
<li class=""><em>Component</em> - Uma peça lógica individual do servidor, como objects ou pickups. Aqueles de que você não precisa não precisam ser carregados.</li>
<li class=""><em>Extension</em> - Código que estende outro pedaço de código. Você pode escrever component extensions, mas as mais comuns são player extensions, que definem alguma estrutura de dados a ser associada a um jogador além de todos os dados normais dele, como health e weapons.</li>
<li class=""><em>UID</em> - <em>U</em>nique <em>ID</em>entifier, um número que representa o seu componente, e somente o seu componente. Isso é sempre obrigatório e pode ser obtido aqui: <a href="https://open.mp/uid" target="_blank" rel="noopener noreferrer" class="">https://open.mp/uid</a></li>
<li class=""><em>Entity</em> - Uma coisa, geralmente algo com que um jogador pode interagir e da qual você pode ter muitas. Objects são entities, mas outros jogadores também são entities; até commands em um processor poderiam ser chamados de entities.</li>
<li class=""><em>Pool</em> - Algo que armazena entities. Quando você tem muitas, precisa conseguir acessá-las por nome ou ID de alguma forma; é isso que um pool faz.</li>
<li class=""><em>Interface</em> - Components usam uma classe base abstrata como interface. Ela declara quais métodos um component tem, mas não contém o código desses métodos. Interfaces são passadas por aí para que components possam se comunicar entre si, mas as implementações são mantidas privadas.</li>
<li class=""><em>SDK</em> - A coleção de todas as interfaces definidas pelo servidor core.</li>
<li class=""><em>ABI</em> - Uma <em>A</em>pplication <em>B</em>inary <em>I</em>nterface é a forma como código compilado conversa com outro código compilado. As interfaces exportadas pelo SDK são <em>ABI stable</em>, o que significa que usar dois componentes compilados em momentos diferentes ainda funcionará em conjunto.</li>
<li class=""><em>pawn-natives</em> - A biblioteca sobre a qual todas as declarações de natives são construídas. Usando um wrapper chamado <em>SCRIPT_API</em> ao redor desta biblioteca: <a href="https://github.com/openmultiplayer/pawn-natives" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/pawn-natives</a></li>
<li class=""><em>Event</em> - Algo que acontece externamente. Coisas como jogadores conectando e digitando comandos são events. Qualquer component pode definir events e avisar outros components quando esses events acontecem.</li>
<li class=""><em>Handler</em> - Um component que quer saber quando um event acontece.</li>
</ul>
<p>Se você tiver dúvidas, o melhor lugar provavelmente são os novíssimos (revividos) fóruns:<br>
<a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp/</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recursos">Recursos<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#recursos" class="hash-link" aria-label="Link direto para Recursos" title="Link direto para Recursos" translate="no">​</a></h2>
<p>Além de todos os novos recursos anunciados para pawn, há vários recursos novos (e recém-anunciados) no servidor:</p>
<ul>
<li class="">Gang zones por jogador, como havia no YSF.</li>
<li class="">Pickups por jogador, também como no YSF.</li>
<li class=""><code>AttachPlayerObjectToPlayer</code>.</li>
<li class="">Melhor suporte a PawnPlus.</li>
<li class="">Suporte a <code>:memory:</code> e outros nomes especiais no SQLite.</li>
<li class="">Flags de abertura do SQLite.</li>
<li class="">Opção de configuração <code>exclude</code> para não carregar certos componentes.</li>
<li class="">Mostrar erros de parsing de configuração, não apenas falhar silenciosamente.</li>
<li class="">Verificação de versão major do SDK, só para o caso de algum dia fazermos grandes mudanças no servidor (esperamos que não).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="correções">Correções<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#corre%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para Correções" title="Link direto para Correções" translate="no">​</a></h2>
<p>Houve alguns novos bugs introduzidos na beta 11, e alguns menores que sobraram de antes. Os corrigidos incluem:</p>
<ul>
<li class="">Aviso de <code>funcidx</code> já registrado.</li>
<li class="">Plugins GDK (streamer etc) sem natives.</li>
<li class="">Crash aleatório em GMX.</li>
<li class="">Callbacks GDK às vezes não chamados.</li>
<li class="">Sem logging quando solicitado no componente SQLite.</li>
<li class="">Algumas configurações não eram redefinidas em GMX.</li>
<li class="">NPCs estavam conectando quando havia muitos de uma vez.</li>
<li class=""><code>.so</code> ainda era necessário em nomes de plugins legados no Linux.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="links">Links<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#links" class="hash-link" aria-label="Link direto para Links" title="Link direto para Links" translate="no">​</a></h2>
<p>Primeiro, claro, a nova versão do servidor:<br>
<a href="https://github.com/openmultiplayer/open.mp/releases" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/open.mp/releases</a></p>
<p>Segundo, os fóruns voltaram. Vá até lá para todas as suas perguntas:<br>
<a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp/</a></p>
<p>Ou, se preferir:<br>
<a href="https://vk.com/open_mp" target="_blank" rel="noopener noreferrer" class="">https://vk.com/open_mp</a></p>
<p>Em seguida, apesar de isso ter sido oferecido algumas vezes, resistimos explicitamente a qualquer dinheiro até este momento; porque não achávamos certo até termos provado nosso trabalho com um lançamento. Com este post, esse momento é agora, então se alguém quiser nos ajudar (todas as doações serão destinadas à infraestrutura e ao trabalho futuro de desenvolvimento do cliente), isso seria muito apreciado:</p>
<p><a href="https://www.patreon.com/open_mp" target="_blank" rel="noopener noreferrer" class="">https://www.patreon.com/open_mp</a><br>
<a href="https://opencollective.com/openmultiplayer" target="_blank" rel="noopener noreferrer" class="">https://opencollective.com/openmultiplayer</a></p>
<p>E, claro, tudo ainda está em desenvolvimento ativo, então confira regularmente todos os links acima para ver o que há de novo.</p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#footnote-label" class="hash-link" aria-label="Link direto para Footnotes" title="Link direto para Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-551b0c">
<p>Quase todas elas. <a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#user-content-fnref-1-551b0c" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-2-551b0c">
<p>Quase não precisar mais de <code>format()</code>. <a href="https://omp.itsneufox.com/pt-BR/blog/release-candidate-1#user-content-fnref-2-551b0c" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Y_Less</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Compatibilidade com SA-MP 0.3.DL, além de outros recursos adicionados e correções de bugs - LANÇAMENTO BETA DO SERVIDOR 9]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/server-beta-9</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/server-beta-9"/>
        <updated>2022-09-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Acabamos de lançar o open.mp server beta 9, trazendo grandes melhorias, correções e o aguardado suporte ao SA:MP 0.3.DL! Esta atualização inclui novos recursos, melhor compatibilidade com plugins e opções aprimoradas de configuração do servidor.]]></summary>
        <content type="html"><![CDATA[<p>Acabamos de lançar o open.mp server beta 9, trazendo grandes melhorias, correções e o aguardado suporte ao SA<!-- -->:MP<!-- --> 0.3.DL! Esta atualização inclui novos recursos, melhor compatibilidade com plugins e opções aprimoradas de configuração do servidor.</p>
<p>Publicado no canal de anúncios do nosso servidor Discord por kseny (<a href="https://discord.gg/samp" target="_blank" rel="noopener noreferrer" class="">discord.gg/samp</a>)</p>
<p>Olá a todos</p>
<p>Acabamos de lançar o open.mp server beta 9, corrigindo vários problemas reportados e adicionando diversos novos recursos. A mudança mais notável é o suporte ao SA<!-- -->:MP<!-- --> 0.3.DL. Agora você pode executar servidores compatíveis com 0.3.7 e 0.3.DL a partir do mesmo binário.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outras-mudanças">Outras mudanças<a href="https://omp.itsneufox.com/pt-BR/blog/server-beta-9#outras-mudan%C3%A7as" class="hash-link" aria-label="Link direto para Outras mudanças" title="Link direto para Outras mudanças" translate="no">​</a></h2>
<ul>
<li class="">Taxa de ticks dinâmica. Especifique uma taxa de ticks alvo, em vez de um tempo de sleep fixo.<!-- -->
<ul>
<li class="">Use o comando de console <code>tickrate</code> para definir a taxa.</li>
<li class=""><code>sleep</code> agora pode ser um float para acomodar taxas de tick precisas.</li>
</ul>
</li>
<li class="">Mais compatibilidade com plugins - fsutil, Discord connector (apenas com build não estática)</li>
<li class="">Retorno de <code>SetSpawnInfo</code> corrigido.</li>
<li class="">Corrige clima e horário não sendo redefinidos após GMX.</li>
<li class="">Corrige vários bugs de GMX.</li>
<li class="">Corrige vários comandos de console.</li>
<li class="">Corrige <code>GetPlayerClass</code>.</li>
<li class="">Corrige <code>GetVehicleLastDriver</code>.</li>
<li class="">Adiciona a native <code>GetVehicles</code>.</li>
<li class="">Adiciona a native <code>GetPlayers</code>.</li>
<li class="">Adiciona a native <code>GetActors</code>.</li>
<li class="">Todos os modos de lagcomp agora estão disponíveis via configuração.</li>
<li class="">Corrige sincronização de trailer.</li>
<li class="">Corrige <code>GetVehicleLastDriver</code>.</li>
<li class="">Corrige <code>GetPlayerRotationQuat</code>.</li>
<li class="">Corrige crash em componente de veículo.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sa-dl">SA<!-- -->:MP<!-- --> DL<a href="https://omp.itsneufox.com/pt-BR/blog/server-beta-9#sa-dl" class="hash-link" aria-label="Link direto para sa-dl" title="Link direto para sa-dl" translate="no">​</a></h2>
<p>Esta é obviamente a grande notícia, e vem com uma série de novas configurações:</p>
<ul>
<li class="">Implementadas todas as natives e callbacks do DL (<code>AddSimpleModel</code>, <code>AddSimpleModelTimed</code>, <code>GetPlayerCustomSkin</code>, <code>OnPlayerFinishedDownloading</code>, <code>OnPlayerRequestDownload</code>):<!-- -->
<ul>
<li class="">A native <code>RedirectDownload</code> e o callback <code>OnPlayerRequestDownload</code> agora estão obsoletos em favor das opções de configuração de CDN.</li>
</ul>
</li>
<li class="">Adiciona a opção de configuração <code>artwork.enable</code> (legado: <code>useartwork</code>).</li>
<li class="">Adiciona a opção de configuração <code>artwork.models_path</code> (legado: <code>artpath</code>).<!-- -->
<ul>
<li class="">O servidor pode carregar modelos personalizados do arquivo <code>artconfig.txt</code>, como o SA<!-- -->:MP<!-- --> faz.</li>
</ul>
</li>
<li class="">A compatibilidade com 0.3.7 é preservada e pode ser configurada pela opção de configuração <code>network.allow_037_clients</code> (true por padrão).</li>
<li class="">O servidor open.mp agora vem com um webserver embutido usado para servir modelos personalizados<!-- -->
<ul>
<li class="">O webserver usa o endereço e a porta de bind do servidor open.mp. Permita conexões TCP na sua porta no firewall se você planeja usá-lo.</li>
<li class="">Se o seu endereço IP público for diferente do endereço de bind (ex: você está atrás de um roteador), será necessário defini-lo na opção de configuração <code>network.public_addr</code>.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observações">Observações<a href="https://omp.itsneufox.com/pt-BR/blog/server-beta-9#observa%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para Observações" title="Link direto para Observações" translate="no">​</a></h2>
<ul>
<li class="">Devido a algumas mudanças, arquivos config.json antigos podem não funcionar corretamente. Use <code>./omp-server --default-config</code> para gerar um novo</li>
<li class="">Usuários de server.cfg não são afetados.</li>
<li class="">Ao permitir conexões 0.3.7, apenas 1000 objetos podem ser criados</li>
<li class="">O servidor open.mp agora fornece dois tipos de builds Linux, standard e static. Recomendamos usar a build standard se possível; ela minimizará incompatibilidades com vários plugins. No entanto, ela exigirá openssl 1.1 instalado no seu sistema. Se você não conseguir instalar uma versão moderna do openssl no seu sistema (normalmente se ele for muito antigo), pode usar a build static, mas alguns plugins ou componentes podem falhar ao carregar e causar crash no servidor.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="includes-oficiais">Includes oficiais<a href="https://omp.itsneufox.com/pt-BR/blog/server-beta-9#includes-oficiais" class="hash-link" aria-label="Link direto para Includes oficiais" title="Link direto para Includes oficiais" translate="no">​</a></h2>
<p>Preparar um lançamento completo não é apenas ter um servidor funcionando, mas também todos os outros periféricos - bibliotecas, ferramentas, documentação e muito mais. No lado pawn, o open.mp é uma atualização significativa, com muitas melhorias de QoL já vistas por meio de correções e novas funções, e mais ainda por vir. Uma grande parte desse esforço é oferecer mais diagnósticos do compilador para encontrar problemas no código com antecedência, principalmente por meio de mais tags e const-correctness. Enquanto as versões oficiais ainda não saíram, você ainda pode ajudar enquanto isso testando seu código com os seguintes includes e ferramentas:</p>
<p><a href="https://github.com/pawn-lang/samp-stdlib/tree/consistency-overhaul" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/samp-stdlib/tree/consistency-overhaul</a><br>
<a href="https://github.com/pawn-lang/pawn-stdlib/tree/backported-natives" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/pawn-stdlib/tree/backported-natives</a><br>
<a href="https://github.com/openmultiplayer/upgrade" target="_blank" rel="noopener noreferrer" class="">https://github.com/openmultiplayer/upgrade</a><br>
<a href="https://github.com/pawn-lang/compiler" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/compiler</a></p>
<p>Eles foram originalmente desenvolvidos para melhorar os includes padrão do SA<!-- -->:MP<!-- -->, mas nunca foram totalmente lançados (ou seja, nunca foram mesclados na master, apesar do PR ter sido aceito). Os includes do open.mp se baseiam na fundação estabelecida aqui, então pense neles como um passo intermediário rumo à segurança completa de tags e const do open.mp; e como um feedback importante sobre a direção deles. Veja os links acima para muito mais informações e documentação sobre atualização.</p>
<p>Como sempre, se você não quiser atualizar, códigos e includes antigos ainda funcionarão (pelo menos no primeiro lançamento).</p>]]></content>
        <author>
            <name>Potassium</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Atualização de 2022 - cross-play e testes beta (Feliz Ano Novo 🎉)]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/update-2022</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/update-2022"/>
        <updated>2022-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Após anos de desenvolvimento, experimentação e uma reescrita completa, o open.mp está alcançando um grande marco! Estamos lançando nosso primeiro programa de testes beta semipúblico e trabalhando em algo enorme: suporte a cross-play entre diferentes versões de GTA San Andreas.]]></summary>
        <content type="html"><![CDATA[<p>Após anos de desenvolvimento, experimentação e uma reescrita completa, o open.mp está alcançando um grande marco! Estamos lançando nosso primeiro programa de testes beta semipúblico e trabalhando em algo enorme: suporte a cross-play entre diferentes versões de GTA San Andreas.</p>
<p>Olá, pessoal!</p>
<p>Depois de 3 anos desde a exposição do open.mp, passando por experimentos e reescritas, tentando diferentes abordagens ao longo dos anos para encontrar o que era melhor para nós e para a comunidade, finalmente chegamos aqui. Mas antes, vale contar um pouco da história:</p>
<p>Começamos o open.mp no início de 2019 e ganhamos muita atenção após a exposição. Em vez de fazermos nosso trabalho em paz, tivemos que acelerar um pouco as coisas, o que gerou alguns problemas na nossa gestão, equipe e base de código. Estávamos longe do que queríamos alcançar. Nossa implementação era poderosa, mas ao mesmo tempo complexa e difícil de continuar. Isso dificultou seguir nosso roadmap, então decisões precisaram ser tomadas. Começamos uma reescrita.</p>
<p>Reescrita Em junho de 2021, após meses de inatividade, a equipe do open.mp decidiu iniciar uma reescrita, com o objetivo de construir um substituto 1:1 do servidor SA<!-- -->:MP<!-- --> (tornando tudo retrocompatível) e adicionar correções com alguns recursos novos. Focando nas coisas mais importantes e deixando recursos extras para depois.</p>
<p>Programa de Testes Beta E agora estamos aqui, iniciando nosso primeiro programa de testes beta semipúblico. Estamos convidando desenvolvedores de servidor com habilidades em Pawn para nos ajudar a testar tudo, verificando todas as nativas e respostas esperadas, além de testes de estresse com seus scripts SA<!-- -->:MP<!-- --> atuais e suas bases de jogadores. Vamos publicar um formulário de inscrição para beta testers após o anúncio; sintam-se à vontade para se inscrever se acharem que podem ajudar nesse processo :)</p>
<p>GTA SA Definitive Edition E por fim, mas não menos importante, estamos empolgados em anunciar que nossa equipe começou a trabalhar em um cliente para Grand Theft Auto: San Andreas Definitive Edition! O cliente Definitive Edition para open.mp será compatível com servidores open.mp! Assim, você poderá hospedar um servidor e deixar as pessoas decidirem com qual jogo querem entrar! Imagine um único servidor open.mp, com jogadores usando o San Andreas original, San Andreas Android e San Andreas Definitive Edition, os três juntos, no mesmo servidor, jogando entre si. Esta é nossa última e mais difícil tentativa de tornar tudo compatível para trazer cross-play à comunidade. Dessa forma - como dono de servidor - você não precisa se preocupar em migrar para uma nova plataforma, começar do zero e dividir sua comunidade. Porque permitimos que todos usem seus scripts SA<!-- -->:MP<!-- --> em um servidor onde os jogadores podem decidir qual jogo usar para se conectar!</p>
<p>Obrigado a todos por permanecerem conosco nessa longa e exaustiva jornada. Temos orgulho dessa grande comunidade que construímos! Feliz Ano Novo 🎉, 2022 será um grande ano para nós e uma mudança no nosso amado mod multiplayer, SA<!-- -->:MP<!-- -->. Amor de todos nós ❤️</p>
<p>Aqui está um vídeo da nossa primeira tentativa de testar a primeira versão do cliente open.mp para GTA San Andreas Definitive Edition, junto com o cliente SA<!-- -->:MP<!-- --> para PC e SA<!-- -->:MP<!-- --> Android, os três no mesmo servidor open.mp: <a href="https://www.youtube.com/watch?v=-PWXXvHe35M" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=-PWXXvHe35M</a></p>
<p>Nosso formulário de inscrição para beta tester está aqui: <a href="https://airtable.com/shrjqca2tpgYa9sQL" target="_blank" rel="noopener noreferrer" class="">https://airtable.com/shrjqca2tpgYa9sQL</a></p>
<p>Lembrando que estamos procurando beta testers para o projeto open.mp SERVER no momento, e isso não está relacionado ao CLIENT. Isto é para scripters/desenvolvedores, NÃO para jogadores comuns neste momento. Por favor, não nos enviem mensagens sobre o cliente e não preencham o formulário se vocês não puderem ajudar a testar o lado SERVER do open.mp. Você precisa ter um bom conhecimento de Pawn e familiaridade com scripting de SA<!-- -->:MP<!-- -->.</p>]]></content>
        <author>
            <name>iAmir</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Como posso entrar para a equipe?]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team"/>
        <updated>2021-08-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Quer fazer parte da equipe do open.mp? Recebemos muito essa pergunta, então veja como você pode contribuir e se envolver!]]></summary>
        <content type="html"><![CDATA[<p>Quer fazer parte da equipe do open.mp? Recebemos muito essa pergunta, então veja como você pode contribuir e se envolver!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="como-posso-entrar-para-a-equipe">Como posso entrar para a equipe?<a href="https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team#como-posso-entrar-para-a-equipe" class="hash-link" aria-label="Link direto para Como posso entrar para a equipe?" title="Link direto para Como posso entrar para a equipe?" translate="no">​</a></h2>
<p>Recebemos MUITO essa pergunta, então achamos que deveríamos fazer uma publicação sobre isso!</p>
<p>Primeiro, muito obrigado pelo interesse em contribuir!</p>
<p>Como você sabe, somos todos jogadores veteranos de SA-MP que se uniram para manter vivo o mundo do multiplayer de SA. Somos apaixonados pela ideia de o projeto ser PARA os jogadores e PELOS jogadores, e é por isso que ele eventualmente será open-source.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="desenvolvimento">Desenvolvimento<a href="https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team#desenvolvimento" class="hash-link" aria-label="Link direto para Desenvolvimento" title="Link direto para Desenvolvimento" translate="no">​</a></h2>
<p>No momento, estamos trabalhando nos ajustes finais para o lançamento beta e, quando ele estiver no ar, vamos apreciar muito e receber de braços abertos as contribuições da comunidade! Vamos precisar de ajuda para testar funcionalidades e casos extremos e, é claro, para procurar bugs e outros problemas que precisam de trabalho.</p>
<p>O teste beta será uma parte extremamente importante da jornada de desenvolvimento, e adoraríamos que todos participassem. Então, por favor, fiquem atentos ao anúncio do teste beta, que prometemos que será muito, muito em breve!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="coordenadores-regionais">Coordenadores regionais<a href="https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team#coordenadores-regionais" class="hash-link" aria-label="Link direto para Coordenadores regionais" title="Link direto para Coordenadores regionais" translate="no">​</a></h2>
<p>Você fala inglês E outro idioma fluentemente? Adoraríamos sua ajuda para traduzir nossas páginas da Wiki, nossas publicações no blog e nossas publicações nas redes sociais, além de ajudar a moderar as seções de idiomas do nosso Discord e do nosso fórum.</p>
<p>As inscrições para essas posições estão fechadas no momento enquanto fazemos algumas mudanças, mas serão abertas novamente em breve!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outras-formas-de-ajudar">Outras formas de ajudar<a href="https://omp.itsneufox.com/pt-BR/blog/how-to-join-the-team#outras-formas-de-ajudar" class="hash-link" aria-label="Link direto para Outras formas de ajudar" title="Link direto para Outras formas de ajudar" translate="no">​</a></h2>
<ul>
<li class="">COMPARTILHE nossas publicações nas redes sociais</li>
<li class="">CONVIDE outros jogadores de SA para o nosso Discord (discord.gg/samp)</li>
<li class="">PARTICIPE da nossa comunidade no Discord</li>
<li class="">AJUDE outros jogadores no Discord (scripting, tecnologia, qualquer coisa!)</li>
</ul>]]></content>
        <author>
            <name>Potassium</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[10.000 membros!]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/10k-members</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/10k-members"/>
        <updated>2021-07-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Acabamos de atingir uma marca incrível: 10.000 usuários no nosso Discord! 🎉 Já faz um tempo, então aqui vai uma atualização rápida sobre o que vem acontecendo e o que vem a seguir para o open.mp.]]></summary>
        <content type="html"><![CDATA[<p>Acabamos de atingir uma marca incrível: 10.000 usuários no nosso Discord! 🎉 Já faz um tempo, então aqui vai uma atualização rápida sobre o que vem acontecendo e o que vem a seguir para o open.mp.</p>
<p>Olá, pessoal!</p>
<p>Recentemente atingimos uma marca incrível: chegamos oficialmente a 10.000 USUÁRIOS no nosso Discord! 🥳🔟🥳</p>
<p>Pensamos em aproveitar esta oportunidade para dar uma pequena atualização, já que sabemos que faz um tempo e todo mundo está se perguntando o que está acontecendo!</p>
<p>Como toda a equipe de desenvolvimento tem empregos em tempo integral e outros compromissos, a situação da COVID realmente atrapalhou todos nós. Isso significa que não tivemos muito tempo para dedicar ao open.mp por um bom tempo.</p>
<p>Mas as coisas voltaram a avançar recentemente: ainda estamos vivos, o projeto está realmente andando mais rápido do que nunca, e fizemos mais progresso nas últimas semanas do que vínhamos fazendo há muito tempo!</p>
<p>Estamos muito orgulhosos do trabalho que está sendo feito aqui e da equipe incrível e refinada que temos.</p>
<p>Vamos dar informações mais detalhadas nos próximos meses, mas queríamos garantir que todos soubessem que não abandonamos o open.mp, que a paixão ainda está aqui e que estamos fazendo o melhor que podemos. Então, por favor, continuem com a gente, pois teremos novidades, capturas de tela e vídeos muito em breve!</p>
<p>Enquanto isso, venham passar um tempo com a gente no Discord! Obrigado a todos os mais de 10.000 de vocês 🥰</p>
<p>Nosso servidor do Discord é um espaço acolhedor e amigável para jogadores e amigos de TODOS os mods e comunidades multiplayer de San Andreas! Algumas das coisas que promovemos são:</p>
<p>✅ Comunidade: Passe um tempo com os membros frequentes, conheça novas pessoas, encontre velhos amigos e jogadores veteranos, encontre pessoas do seu país/região nos canais de idiomas específicos, conheça pessoas de SA-MP / MTA / outros mods multiplayer</p>
<p>✅ Scripting: Aprenda a criar scripts, receba ajuda com seus scripts, ajude outras pessoas</p>
<p>✅ Divulgação de servidores: Mostre seu servidor SA-MP nos canais dedicados</p>
<p>✅ Programação e tecnologia: Converse e receba ajuda com outras linguagens de programação e desenvolvimento de software, suporte técnico, conheça outras pessoas com interesses parecidos para trabalhar junto</p>
<p>✅ Gaming: Encontre pessoas para jogar (não apenas SA!), converse sobre notícias e atualizações de jogos</p>
<p>✅ Showcase: Você é YouTuber? Streamer? Artista? Faz música legal? É chef? Talvez pesque? Ou monte carros? Seja lá do que você se orgulha, mostre para todo mundo!</p>
<p>✅ open.mp: Fique por dentro do progresso mais recente do desenvolvimento do open.mp e das movimentações no GitHub, passe um tempo com a equipe, assista às nossas streams de desenvolvimento exclusivas para VIPs do Discord quando elas voltarem a funcionar!</p>]]></content>
        <author>
            <name>Potassium</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[SA-MP Android (Versão Mobile)]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/samp-mobile</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/samp-mobile"/>
        <updated>2021-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Recebemos muitas perguntas sobre SA-MP para Android, então queríamos compartilhar nossos pensamentos e planos para uma alternativa multiplayer legal.]]></summary>
        <content type="html"><![CDATA[<p>Recebemos muitas perguntas sobre SA-MP para Android, então queríamos compartilhar nossos pensamentos e planos para uma alternativa multiplayer legal.</p>
<p>A visão da equipe open.mp sobre SA-MP para Android</p>
<p>Olá a todos,</p>
<p>Queríamos escrever um post rápido sobre nossa visão do SA-MP para Android, porque estamos recebendo muitos comentários sobre isso nos nossos vídeos do YouTube e no Discord.</p>
<p>Como dissemos em nosso vídeo no YouTube, não apoiamos a versão atual do SA-MP para Android. Esse aplicativo foi criado usando código-fonte roubado da equipe SA-MP, o que torna o aplicativo ilegal.</p>
<p>Nós não apoiamos o roubo de código de outras pessoas e não apoiamos o uso de código roubado. Também não nos associamos a atividades ilegais.</p>
<p>Vemos que o multiplayer de GTA SA para mobile tem uma grande comunidade, e gostaríamos de receber essa comunidade no open.mp.</p>
<p>Atualmente estamos discutindo como podemos criar nosso próprio mod multiplayer para SA mobile, para que seja feito de forma legal e justa! :)</p>
<p>Isso significa que é bem possível que exista open.mp para mobile no futuro, então continuem nos apoiando enquanto resolvemos isso!</p>
<p>Convidamos a comunidade mobile para entrar no nosso Discord oficial com mais de 7000 membros; criamos um canal para vocês em #samp-android e estamos ansiosos para ouvir seus pensamentos e opiniões!</p>
<p>Nos vemos lá!</p>
<p><a href="https://discord.gg/samp" target="_blank" rel="noopener noreferrer" class="">https://discord.gg/samp</a></p>]]></content>
        <author>
            <name>Potassium</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Podcast ao vivo]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/interview</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/interview"/>
        <updated>2020-11-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Recentemente organizamos um podcast de perguntas e respostas ao vivo com a equipe de desenvolvimento do open.mp, cobrindo tudo, desde atualizações do projeto e melhorias de scripting até planos futuros e envolvimento da comunidade. Se você perdeu, pode assistir à gravação completa aqui!]]></summary>
        <content type="html"><![CDATA[<p>Recentemente organizamos um podcast de perguntas e respostas ao vivo com a equipe de desenvolvimento do open.mp, cobrindo tudo, desde atualizações do projeto e melhorias de scripting até planos futuros e envolvimento da comunidade. Se você perdeu, pode assistir à gravação completa aqui!</p>
<p>No dia 24 de outubro tivemos um podcast de perguntas e respostas com os devs, que foi gravado para vocês abaixo:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vídeo">Vídeo<a href="https://omp.itsneufox.com/pt-BR/blog/interview#v%C3%ADdeo" class="hash-link" aria-label="Link direto para Vídeo" title="Link direto para Vídeo" translate="no">​</a></h2>
<p><a href="https://www.youtube.com/watch?v=bTYWWsXkcDo" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=bTYWWsXkcDo</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transcrição">Transcrição<a href="https://omp.itsneufox.com/pt-BR/blog/interview#transcri%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para Transcrição" title="Link direto para Transcrição" translate="no">​</a></h2>
<p><strong>Potassium:</strong><br>
<!-- -->olá a todos, bem-vindos à nossa primeira live de open multiplayer<br>
<!-- -->hum, alguém pode fazer um teste de microfone, alguém pode me dizer se isso está funcionando, por favor? jamie?</p>
<p><strong>everyone:</strong><br>
<!-- -->está funcionando<br>
<!-- -->está funcionando<br>
<!-- -->ok<br>
<!-- -->sim<br>
<!-- -->sim, ouvi saindo do outro lado<br>
<!-- -->sim, tem um atraso considerável<br>
<!-- -->sim, tudo bem</p>
<p><strong>Potassium:</strong><br>
<!-- -->certo, hum, olá, uh, e aí<br>
<!-- -->finalmente estamos aqui fazendo isso, eu acho, hum</p>
<p><strong>Southclaws:</strong><br>
<!-- -->muitos dias de planejamento</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim<br>
<!-- -->talvez devêssemos começar nos apresentando, então... <strong>Southclaws</strong>?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sou eu</p>
<p><strong>Potassium:</strong><br>
<!-- -->conte a todos um pouco sobre você e o que você faz aqui</p>
<p><strong>Southclaws:</strong><br>
<!-- -->uh sim, acho que estou por perto no SAMP desde tipo 2008 ou 2007, não lembro... faz muito tempo... hum, no momento eu meio que faço as coisas do site, gerencio a wiki e faço um pouquinho de código, mas não muito, esses caras são muito melhores nisso do que eu. mas sim, eu faço principalmente as coisas da wiki e do site, então essa é meio que a minha área</p>
<p><strong>Potassium:</strong><br>
<!-- -->e <strong>Y_Less</strong>?</p>
<p><em>alerta da stream com CJ dizendo "here we go again"</em></p>
<p><strong>Y_Less:</strong><br>
<!-- -->oi, eu sou Y_Less:<br>
<!-- -->estou no SAMP há mais tempo do que você<br>
<!-- -->entrei para a equipe beta antes mesmo de ele ser lançado, então é isso, já faz um tempo. sou um ex-dev, não tenho total certeza se preciso me apresentar, mas é isso</p>
<p><strong>Southclaws:</strong><br>
<!-- -->não, provavelmente não</p>
<p><strong>Potassium:</strong><br>
<!-- -->provavelmente não</p>
<p><strong>Southclaws:</strong><br>
<!-- -->tenho certeza de que todo mundo conhece você</p>
<p><strong>Potassium:</strong><br>
<!-- -->só por garantia</p>
<p><strong>Y_Less:</strong><br>
<!-- -->scripters me conhecem, mas jogadores não necessariamente</p>
<p><strong>Potassium:</strong><br>
<!-- -->não, tenho quase certeza de que todo mundo conhece</p>
<p><strong>Y_Less:</strong><br>
<!-- -->também sou a única forma de dev atualmente não removida da página "about" do client</p>
<p><strong>Potassium:</strong><br>
<!-- -->uhhh... legal... eu acho?</p>
<p><strong>BigETI:</strong><br>
<!-- -->isso é uma conquista</p>
<p><strong>Potassium:</strong><br>
<!-- -->é uma conquista, sim<br>
<!-- -->ok, josh, sua vez</p>
<p><strong>j0sh.../alasnkz:</strong><br>
<!-- -->bem, eu sou josh e sou um dos principais desenvolvedores do open.mp<br>
<!-- -->estou no samp há pelo menos sete anos<br>
<!-- -->comecei a programar há seis anos por causa do samp<br>
<!-- -->e se você esteve no discord, sabe quem eu sou, estou sempre lá e sempre disponível para conversar se você precisar de ajuda com qualquer coisa</p>
<p><strong>Potassium:</strong><br>
<!-- -->ah, isso foi muito fofo<br>
<!-- -->quem é você e o que você fez com o josh?<br>
<!-- -->ok, Amir?</p>
<p><strong>iAmir:</strong><br>
<!-- -->bem, eu sou Amir e estou por aqui desde 2010, eu acho, foi quando comecei a jogar samp na verdade. eu apenas faço parte da equipe de desenvolvimento do open.mp e meio que ajudo com código e coisas assim</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal! e bigETI?</p>
<p><strong>BigETI:</strong><br>
<!-- -->sim, eu sou bigeti, tenho 27 anos, comecei a jogar samp por volta de 2009, contribuí para projetos, tive meus próprios servidores etc, e agora também sou contribuidor do<br>
<!-- -->open.mp</p>
<p><strong>Potassium:</strong><br>
<!-- -->incrível, e michael?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->eu sou JustMichael:, estou por aqui desde 2007, fui dono de algumas comunidades, lutei para subir, mas hoje em dia eu basicamente só sigo o Southclaws: e gerencio todos os projetos que ele abandonou! e fora isso eu trabalho no open.mp no tempo livre</p>
<p><strong>Southclaws:</strong><br>
<!-- -->ele é o pai substituto de tudo que eu criei</p>
<p><em>todo mundo ri</em></p>
<p><strong>Potassium:</strong><br>
<!-- -->incrível!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->quem é você, Potassium?</p>
<p><strong>Potassium:</strong><br>
<!-- -->essa é uma boa pergunta! então eu sou Potassium, obviamente, estou na comunidade samp desde mais ou menos 2008/2009 talvez... então tipo 10 anos... ou mais, eu acho... matemática!<br>
<!-- -->não sou scripter, fico dizendo para todo mundo que talvez um dia eu seja, provavelmente não vou ser, mas enfim! eu realmente não tenho uma história, sou só uma pessoa aleatória do fórum do samp e eu só, não sei, eu simplesmente amo esta comunidade e quero fazer parte de mantê-la viva, então eu meio que me convidei para esta equipe... então yay!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->tudo bem, você faz um trabalho bem importante</p>
<p><strong>BigETI:</strong><br>
<!-- -->você é definitivamente bem-vinda!</p>
<p><strong>Potassium:</strong><br>
<!-- -->eu não consigo fazer nenhuma coisa técnica, elas passam completamente por cima da minha cabeça, então só demos ao meu papel o nome de "relações públicas" e eu posto memes idiotas de vez em quando... mas tudo bem! alguém precisa fazer isso!</p>
<p><strong>Potassium:</strong><br>
<!-- -->então faz sentido explicar rapidamente sobre o que é o openmp de fato ou? acho que, sim, acho que deveríamos, só caso alguém esteja ouvindo e não tenha certeza. então basicamente todos nós somos jogadores old school de san andreas, como vocês acabaram de ouvir, e todos fazemos parte de uma comunidade<br>
<!-- -->chamada san andreas multiplayer, é uma modificação multiplayer para san andreas e está um pouco desatualizada agora, acho que dá para dizer isso, então estamos meio que tentando trazer mais vida de volta para ela porque ainda não estamos prontos para deixar nossa pequena comunidade morrer. isso é um resumo justo?</p>
<p><strong>everyone:</strong><br>
<!-- -->acho que sim<br>
<!-- -->sim</p>
<p><strong>Y_Less:</strong><br>
<!-- -->quero meio que abordar a grande pergunta para começar, sobre o PORQUÊ. em alguns aspectos<br>
<!-- -->nós realmente não queremos criar o open.mp - estávamos perfeitamente felizes jogando samp, é um joguinho legal, ele faz tudo que queremos, mas kalcor o escreveu, ele tem o código-fonte e<br>
<!-- -->coisas assim, ele teve alguma ajuda, e resumindo ele não estava mais interessado em mantê-lo, o que é ok e acontece com todo mundo, e eu só quero deixar claro que não tenho ressentimentos em relação a ele por isso, porque todo mundo segue em frente eventualmente, você ganha novos interesses, mas<br>
<!-- -->ele decidiu que queria simplesmente levar tudo com ele. ele não queria passar o código-fonte adiante, só queria parar, então achou que todos os outros também deveriam parar. e nós gostávamos bastante daqui, então não paramos.</p>
<p><strong>Potassium:</strong><br>
<!-- -->correto</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, isso parece certo</p>
<p><strong>Y_Less:</strong><br>
<!-- -->como eu disse, se ele quer seguir em frente e ir para outras coisas, isso é prerrogativa dele</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, isso mesmo, não estamos julgando, só estamos um pouco tristes. mas tudo bem, porque vamos consertar. podemos fazer algo a respeito, então faremos!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, vamos seguir para as próximas coisas maiores</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, isso mesmo. certo, então tivemos várias perguntas no nosso fórum, que aliás é<br>
<a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp</a> então cadastrem-se lá!<br>
<!-- -->então acho que vamos direto a elas.<br>
<!-- -->a pergunta mais urgente agora obviamente é sobre o drama recente do samp. então, para quem não sabe, o fórum do samp e a wiki do samp estão offline há algumas semanas, e não queremos fazer suposições, mas não parece que eles vão voltar<br>
<!-- -->tão cedo. acho que essa é uma suposição bem justa de se fazer.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->os links foram removidos da página inicial, se fosse apenas algo temporário ele<br>
<!-- -->provavelmente não teria removido os links.</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, isso mesmo, então não parece que eles vão voltar. então as pessoas meio que querem saber quais são nossos pensamentos sobre isso, o que achamos que realmente aconteceu? então... microfone aberto... <strong>Southclaws</strong>? alguém?</p>
<p><strong>Y_Less:</strong><br>
<!-- -->é basicamente o que eu acabei de dizer, kalcor esteve desinteressado por anos, é por isso que<br>
<!-- -->simplesmente houve zero desenvolvimento, e vários de nós, quando eu estava na equipe beta, continuávamos tentando empurrá-lo para lançar atualizações e coisas assim, e na verdade a comunidade inteira estava gritando por atualizações, ele não queria porque tinha perdido o interesse, queria seguir em frente e isso... como eu já disse, tudo bem, não nos importamos que as pessoas sigam em frente e deixem<br>
<!-- -->projetos, foi o fato de ele se recusar a passar as rédeas para qualquer outra pessoa, isso é apenas uma<br>
<!-- -->continuação disso, os fóruns eram bem enormes, não eram fáceis de administrar, é quase um trabalho em tempo integral só moderá-los. e eu suspeito que ele simplesmente perdeu totalmente o interesse e decidiu que não quer mais fazer isso, mas não quer que ninguém continue seu legado, então ele está tirando tudo do ar. estou um pouco confuso que a página inicial ainda esteja lá.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->eu imagino que provavelmente seja porque a página inicial deve custar quase nada para manter online, enquanto o fórum provavelmente exigia algum tempo e despesa para<br>
<!-- -->de fato funcionar. imagino que seja por isso.</p>
<p><strong>BigETI:</strong><br>
<!-- -->você ainda pode baixar o samp pela página inicial principal</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, isso é bom, pelo menos eles podem fazer isso. mas se completarmos nossa missão<br>
<!-- -->eles não precisarão!</p>
<p><strong>Potassium:</strong><br>
<!-- -->pessoalmente eu só espero que kalcor esteja bem! e se ele pegou COVID e está no hospital e não consegue manter</p>
<p><strong>Southclaws:</strong><br>
<!-- -->isso seria muito ruim</p>
<p><strong>Potassium:</strong><br>
<!-- -->e se simplesmente expirou e ele não consegue colocar de volta porque está no hospital</p>
<p><strong>JustMichael:</strong><br>
<!-- -->isso seria extremamente infeliz</p>
<p><strong>Potassium:</strong><br>
<!-- -->e aí ele volta e há tipo... um motim... enfim</p>
<p><strong>JustMichael:</strong><br>
<!-- -->e enquanto ele estava no hospital ele por acaso removeu o link do fórum e da wiki...?</p>
<p><strong>Potassium:</strong><br>
<!-- -->ah sim... justo</p>
<p><em>todo mundo ri</em></p>
<p><strong>Y_Less:</strong><br>
<!-- -->estou só pensando que talvez tivéssemos ouvido falar disso</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, provavelmente teríamos ouvido falar disso, você tem razão</p>
<p><strong>Y_Less:</strong><br>
<!-- -->ou talvez não, porque até os beta testers mal ficam sabendo de qualquer coisa, posso falar por<br>
<!-- -->experiência pessoal, as pessoas continuavam me perguntando quando sai a próxima versão?<br>
<!-- -->eu sei tão pouco quanto vocês. mas temos nosso próprio fórum privado e ele está morto.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->ele acabou sendo bem ruim em comunicar qualquer coisa para qualquer um dos devs</p>
<p><strong>Potassium:</strong><br>
<!-- -->hora de seguir em frente. sobre o assunto de fóruns, nosso fórum e nossa wiki parecem ser substitutos bastante populares para os do samp, então fiquem à vontade para conferir</p>
<p><strong>Y_Less:</strong><br>
<!-- -->eles não estão mortos</p>
<p><strong>JustMichael:</strong><br>
<!-- -->estão muito ativos e mantidos, mais do que eu já vi</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, particularmente para ajuda com scripting</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, as contribuições para a wiki têm sido ótimas, quando a wiki saiu do ar, ter<br>
<!-- -->um monte de gente copiando páginas da wiki antiga para a nova foi muito bom, então um salve para todos que contribuíram, obrigado, isso foi muito legal. as coisas de tradução são ótimas porque acho que isso é algo que a wiki antiga definitivamente não tinha, ela tinha algumas páginas que estavam traduzidas, mas acho que não muitas.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->acho que era tipo polonês, brasileiro e... sim... faltava muita coisa.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, traduzir isso é definitivamente uma prioridade e temos algumas pessoas boas para nos ajudar com isso, então isso é brilhante</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, isso é incrível. só para registrar, <a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp</a> é o nosso fórum e <a href="https://open.mp/docs" target="_blank" rel="noopener noreferrer" class="">https://open.mp/docs</a> é a nossa wiki, então vão lá!<br>
<!-- -->então obviamente o próximo barulho de alerta do discord que me assustou, desculpa! a próxima pergunta mais frequente é e sempre será a data de lançamento. então obviamente não temos uma data, nunca daremos uma data específica porque somos todos voluntários e fazemos isso no nosso tempo livre, mas temos uma ideia aproximada de talvez tipo uma porcentagem de quão avançados estamos antes de podermos torná-lo público? estamos em 1%? estamos na metade? estamos em 90%? o que vocês acham?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->quer dizer, estamos bem perto, não estamos?</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, acho que a maioria dos nossos grandes sistemas, a maior parte, está pronta. dizem que os primeiros 90% levam 90% do tempo, e os últimos 10% levam os outros 90% do tempo porque é tudo aquele tipo de ajuste fino, e há bugs, e quando isso e isso e isso e isso acontecem juntos, de repente tudo quebra. a maior parte do que chamamos de "módulos" já está pronta, posso explicar módulos depois, mas essencialmente os grandes blocos de código já estão prontos. é só conectá-los, garantir que todos os pequenos recursos extras estejam lá. está progredindo de forma bastante constante, especialmente agora recentemente,</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, tivemos um impulso bem grande de desenvolvimento ativo recentemente, o que é muito bom</p>
<p><strong>Potassium:</strong><br>
<!-- -->eu ia justamente perguntar se alguém mais tinha algo a acrescentar a isso</p>
<p><strong>j0sh...:</strong><br>
<!-- -->acho que depende do que você define como público, posso praticamente dizer que estamos bem perto<br>
<!-- -->de ter um servidor de teste beta, tenho certeza de que estamos perto disso. mas um lançamento público no sentido de todo mundo ter o executável obviamente está um pouco mais distante, mas acho que um servidor de teste virá relativamente em breve.</p>
<p><strong>Potassium:</strong><br>
<!-- -->woohoo!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, precisamos de uma boa quantidade de tempo para testar todo o progresso até agora porque ainda haverá edge cases</p>
<p><strong>Potassium:</strong><br>
<!-- -->vocês ouviram isso, chat?! um servidor de teste virá relativamente em breve! gravem as palavras dele!<br>
<!-- -->certo, então a maioria das perguntas daqui em diante é do ponto de vista de scripting, então obviamente eu não faço ideia sobre essas coisas, então é aqui que vocês brilham! então vocês mencionaram módulos há pouco, queriam explicar um pouco isso? ou não queriam?</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, basicamente módulos são uma extensão de uma tendência geral no desenvolvimento de bibliotecas e coisas assim que se desenvolveu ao longo dos anos, para isolamento de código, então todos os objetos, todo o código relacionado a objetos, isso é um módulo. todo o código relacionado a checkpoints, isso é um módulo. veículos é um módulo separado.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então em termos de plugins e filter scripts como temos no samp, é isso que estamos... estamos renomeando eles para módulos? acho que vi algo sobre isso antes, mas não entendo essas coisas!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->não exatamente, módulos são mais como um bloco de código que fornece alguma funcionalidade, então seus filter scripts... quer dizer, nós não temos mais filter scripts de verdade, temos apenas scripts, porque game modes e filter scripts eram uma distinção arbitrária e inútil desde o começo. ainda temos plugins, mas há plugins legados, que são todos os existentes,<br>
<!-- -->a maioria deles deve funcionar, alguns não vão.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->qualquer um que faça memory hacking não vai</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, se eles usam memory hacking não vão funcionar porque isso é só alterar valores na memória em locais muito específicos, mas como é um código completamente diferente, tudo<br>
<!-- -->mudou de lugar</p>
<p><strong>BigETI:</strong><br>
<!-- -->sim, mas aí se alguém quiser fazer, digamos, um plugin de memory hacking funcionar no openmp, pode simplesmente usar a API existente no openmp em vez de hackear memória</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, você não vai precisar seguir esse caminho mais</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, então temos uma API C completa, os plugins legados tinham cerca de 3 funções que podiam chamar no servidor, e era isso. e havia todo tipo de workaround e formas horríveis de<br>
<!-- -->colocar natives a partir de plugins, agora você pode fazer isso diretamente, então 90% da necessidade de plugins de memory<br>
<!-- -->hacking simplesmente desaparece. coisas como samp gdk, que era só puxar funções pawn<br>
<!-- -->a partir de plugins, isso acabou. os plugins são todos esses legados, e módulos são basicamente os substitutos. como plugins, mas muito mais poderosos.</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal. estou só sorrindo e concordando porque não entendo, mas tenho certeza de que a maioria dos nossos espectadores entende, então isso é incrível!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->se alguém quiser algum esclarecimento sobre isso, é só perguntar! talvez você esteja no mesmo barco que a Potassium</p>
<p><strong>Potassium:</strong><br>
<!-- -->correto! então obviamente temos nosso fórum para perguntas assim, mas também teremos uma pequena sessão de perguntas ao vivo no final, então fiquem por aí!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->também não é como se não fôssemos documentar o código quando ele realmente for lançado, então sabe, se você está tendo dificuldade para entender o que qualquer uma dessas coisas é, teremos algum tipo de explicação que simplesmente diz o que é.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então recebemos algumas perguntas sobre limites, sei que conversamos sobre isso no nosso último Q&amp;A, e acho que vocês disseram que não haverá limites em coisas como veículos e objetos, certo?</p>
<p><strong>BigETI:</strong><br>
<!-- -->não há razão para ter limites arbitrários, mas agora o openmp será apenas um lançamento do servidor por enquanto</p>
<p><strong>Potassium:</strong><br>
<!-- -->lançamento do servidor</p>
<p><strong>BigETI:</strong><br>
<!-- -->então você precisa torná-lo competitivo com san andreas multiplayer, portanto precisamos<br>
<!-- -->emular limites, mas internamente no openmp não há limites do lado do servidor. depende apenas do quanto sua máquina é capaz de fazer</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, então parece que na primeira versão os limites terão que existir<br>
<!-- -->até lançarmos nosso próprio client</p>
<p><strong>Y_Less:</strong><br>
<!-- -->um streamer interno</p>
<p><strong>BigETI:</strong><br>
<!-- -->não podemos ultrapassar os limites do jogo agora</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, isso é verdade, sim</p>
<p><strong>Y_Less:</strong><br>
<!-- -->houve uma questão interessante com limites que estávamos discutindo semana passada, o próprio servidor também pode fazer stream de jogadores, então em teoria você poderia ter jogadores ilimitados no servidor mesmo com este client legado do samp, basicamente apenas enviamos os jogadores mais próximos de você, sincronizamos eles, e então quando você se afasta mudamos quais jogadores estão sincronizados. mas tivemos que desativar isso por padrão porque significa que os IDs de todos ficam constantemente<br>
<!-- -->mudando, então eu me conectaria ao servidor e teria um ID de servidor 27, mas quando sou streamado para você eu tenho seu ID local 3. estou sendo streamado para outra pessoa e tenho um<br>
<!-- -->ID local para ela de 17. então você, como admin, vê que estou trapaceando e digita /ban 5 porque acha que eu sou o ID 5, mas o servidor acha que sou o ID 27. e traduzir isso quando as pessoas estão usando IDs crus em vez de nomes é complicado. decidimos desativar isso por enquanto e<br>
<!-- -->torná-lo opcionalmente habilitado se as pessoas quiserem, mas com a ressalva de que o script delas precisará estar ciente disso e, por exemplo, se em um comando elas apenas usam strval para pegar o ID digitado, não façam isso porque provavelmente estará errado, ou façam isso e então traduzam de ID local para ID do servidor. sscanf provavelmente já dará suporte a isso, mas se você digitar "u", se você<br>
<!-- -->já usa sscanf com "u", ele vai traduzir automaticamente. alguns scripts precisarão ser atualizados para dar suporte a isso.</p>
<p><strong>Potassium:</strong><br>
<!-- -->na verdade a próxima pergunta era "ainda estaremos limitados a 1000 slots de jogadores?" então acho que isso meio que se conecta.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->a resposta para isso é não!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->se você habilitar</p>
<p><strong>BigETI:</strong><br>
<!-- -->eu queria acrescentar a isso, então nossa ideia é ter tipo, você pode configurar o que quer limitar<br>
<!-- -->para si mesmo, porque por exemplo você não quer um servidor onde possa gerar entidades infinitas, porque alguém poderia abusar disso e simplesmente derrubar seu servidor, então deveria haver alguma configuração que você possa fazer para limitar coisas, como jogadores ou veículos ou outra coisa.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, justo</p>
<p><strong>Y_Less:</strong><br>
<!-- -->só quero dizer que não sou eu no chat da twitch</p>
<p><strong>Potassium:</strong><br>
<!-- -->tudo bem, eu bani eles, aquele não é o verdadeiro Y_Less: no chat, ESTE é o verdadeiro Y_Less:!</p>
<p><strong>BigETI:</strong><br>
<!-- -->qual é sua conta da twitch, Y_Less:?</p>
<p><strong>Potassium:</strong><br>
<!-- -->tudo bem, não é importante. então seguindo com as perguntas da comunidade, as pessoas querem saber em quais linguagens além de pawn poderemos scriptar nossos servidores.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->isso depende completamente dos desenvolvedores de plugins, já temos vários que podem ser facilmente portados, e alguns já funcionam, acho que bigeti você estava trabalhando em ou pelo menos pensando em escrever outro em C#, certo?</p>
<p><strong>BigETI:</strong><br>
<!-- -->eu estava pensando em implementar algum módulo que implemente outra linguagem, como por exemplo C#, porque hoje em dia C#... bem, antes de tudo não quero dizer que será oficialmente suportado, mas estou pensando em fazer um módulo, então ele será lançado sob meu nome.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sei que existem os sampnodes, isso é do amir, e eu também ajudo nisso às vezes, então isso deve ser fácil de portar se já não funcionar.</p>
<p><strong>BigETI:</strong><br>
<!-- -->acho que já funciona com openmp, seria melhor e mais rápido se usarmos a API C que estamos fornecendo para openmp, então é melhor do que passar pela camada pawn</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, bem, teremos que encontrar uma forma de traduzir o plugin de rust de alguma maneira, ou o rust sdk, para fazer isso funcionar</p>
<p><strong>Y_Less:</strong><br>
<!-- -->samp gdk?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, vamos encontrar uma forma de dar suporte aos plugins rust atuais</p>
<p><strong>BigETI:</strong><br>
<!-- -->chega de fake amx bollocks</p>
<p><strong>Y_Less:</strong><br>
<!-- -->muitos desses plugins usam samp gdk para acessar pawn, só precisamos mudar o nível<br>
<!-- -->mais baixo ali</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, o de rust não... ele meio que tentou reinventar à própria maneira</p>
<p><strong>Southclaws:</strong><br>
<!-- -->não acho que a comunidade de rust seja tão grande</p>
<p><strong>JustMichael:</strong><br>
<!-- -->há alguns plugins dos quais as pessoas dependem</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, talvez eu tente fazer isso, não sei, mas acho que seria legal escrever módulos em rust, não deve ser muito difícil.</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal, ok, próxima pergunta: sampCTL/openCTL será o gerenciador de pacotes oficial do open multiplayer?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->essa é minha área! sim, será, será renomeado, claro, sim, vai ser<br>
<!-- -->Open Packet Manager - OPM.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->foi isso que decidimos</p>
<p><strong>Southclaws:</strong><br>
<!-- -->foi isso que eu decidi!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->eu te dei o nome!</p>
<p><strong>Southclaws:</strong><br>
<!-- -->estamos meio que trabalhando em recursos experimentais no momento, eu meio que acabei de construir algumas coisinhas experimentais rápidas e interessantes para isso, elas vêm nos próximos dias, tenho programado, então sim, estou pensando principalmente em coisas de experiência de desenvolvedor, então<br>
<!-- -->coisas como logging e interface de linha de comando, variáveis de ambiente, sabe, todas as coisas que ajudam você a construir game modes mais rápido, implantá-los mais rápido e automatizar o máximo de coisas possível. como o processo de deploy e esse tipo de coisa, então<br>
<!-- -->sim, é nisso que estou pensando de verdade. algum CTL permanecerá compatível e basicamente apenas adicionará suporte a openmp. então você pode mudar para ele apenas alterando uma string, em teoria, e alterando seus includes e então recompilar e simplesmente funcionará. esse é o plano, de qualquer forma!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->isso vai ser muito divertido!</p>
<p><strong>Southclaws:</strong><br>
<!-- -->e então eventualmente ele também terá vários recursos novos, melhor tratamento de logs, melhor suporte a docker, melhor automação de deploy, coisas assim, algumas das quais serão implementadas no próprio openmp, muitas das coisas que sampCTL faz são na verdade para<br>
<!-- -->contornar escolhas de design estranhas do servidor samp, então algumas dessas coisas<br>
<!-- -->não precisarão acontecer, algumas delas serão simplesmente implementadas diretamente no openmp. então sim, espero que isso responda</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, sampCTL/openCTL é oficialmente suportado, oficialmente endossado, provavelmente distribuído com ele, mas isso não significa que seja obrigatório, você pode escrever scripts sem ele, se não sabe como então não precisa começar a usá-lo</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, é meio como você poder usar node.js sem npm</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal, ok, próxima pergunta: quais são os tempos de build atuais do openmp?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->isso significa os tempos de build do C++ ou de script?</p>
<p><strong>Potassium:</strong><br>
<!-- -->não sei</p>
<p><strong>Southclaws:</strong><br>
<!-- -->poderíamos responder ambos porque ambos são perguntas que podemos responder</p>
<p><strong>BigETI:</strong><br>
<!-- -->se você recompilar o projeto inteiro, faça um café! clique em compilar, faça um café, volte e estará pronto.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->melhorou muito, antes era tipo meia hora, agora são cerca de oito minutos.<br>
<!-- -->passei muito tempo melhorando isso. o módulo de player costumava estar em todo lugar, incluído por tudo, se você acidentalmente tocasse nesse arquivo era um rebuild completo. muda uma linha, é um rebuild<br>
<!-- -->completo.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->quanto aos scripts, isso não deve mudar muito, de verdade. temos uma camada de compatibilidade, scripts serão os mesmos, acho que há uma pergunta sobre isso mais tarde, então vou deixar para lá.</p>
<p><strong>Potassium:</strong><br>
<!-- -->certo, legal, obrigado. próxima pergunta é: muita gente queria saber se teremos um anti-cheat embutido?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não, acho que teremos um tipo de coisa muito pequena... não exatamente um anti-cheat, mas mais como<br>
<!-- -->apenas vamos tentar bloquear alguns problemas conhecidos, exploits, coisas assim, mas acho que vamos deixar isso para outros desenvolvedores</p>
<p><strong>Southclaws:</strong><br>
<!-- -->vamos fornecer às pessoas as ferramentas para construir bons anti-cheats, provavelmente é a forma mais eficiente, porque então a comunidade pode se unir e construir soluções para cheats específicos. porque se a comunidade depender de nós para fazer isso, então isso simplesmente será ultrapassado porque a quantidade de pessoas desenvolvendo cheats vai superar a quantidade de pessoas desenvolvendo openmp</p>
<p><strong>Y_Less:</strong><br>
<!-- -->provavelmente vou postar um repo oficial para um, onde qualquer pessoa possa contribuir, e servi-lo como um módulo, porque a ideia é que eventualmente... bem, chama-se openmp, é para ser open source. atualmente não é porque ainda não terminamos o primeiro lançamento, mas quando estiver,<br>
<!-- -->então podemos lançá-lo e outras pessoas podem contribuir, e essa é uma das principais áreas onde esperamos que contribuam. então ele terá um anti-cheat oficialmente incluído? sim, se vocês nos ajudarem!</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, é isso que importa de verdade, se a comunidade ajudar, então sim, teremos coisas assim!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->muita gente esquece que o samp teve um, eles experimentaram um anti-cheat por um tempo, e por um tempo quero dizer cerca de um mês, antes de ficar completamente inviável porque olha só, eles bloquearam esse cheat, levou sete segundos para contornar, agora<br>
<!-- -->você tem um novo cheat. é um jogo constante de gato e rato.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->acho que o anti-cheat deveria ser separado, porque não vamos atualizar o mod tanto assim, não queremos atualizar todo dia ou toda semana, será mais uma coisa de longo prazo, mas um anticheat precisa ser atualizado com bastante frequência para combater os cheats, então<br>
<!-- -->tê-lo como um módulo separado ou algo assim provavelmente seria melhor para servidores do que depender de nós esperando lançarmos no fim do mês ou por quanto<br>
<!-- -->tempo nosso processo de atualização levar</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, é meio isso que eu quis dizer sobre impulsioná-lo centralmente</p>
<p><strong>Potassium:</strong><br>
<!-- -->então se deixarmos aberto, todos podem contribuir e aí não fica inteiramente em vocês manter ele atualizado e tal. e nessa nota, mods CLEO, muita gente quer saber se ainda vão funcionar, ou mods em geral</p>
<p><strong>JustMichael:</strong><br>
<!-- -->eles são todos client-side</p>
<p><strong>j0sh...:</strong><br>
<!-- -->não haverá mudanças</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não nesta versão, de qualquer forma</p>
<p><strong>Y_Less:</strong><br>
<!-- -->hum, então a menos que eles comecem a trapacear de uma forma que o servidor possa detectar</p>
<p><strong>Potassium:</strong><br>
<!-- -->ok, as pessoas queriam saber se o openmp terá uma função GPCI corrigida, tipo um serial no MTA</p>
<p><strong>JustMichael:</strong><br>
<!-- -->o problema com isso é que nunca será uma forma 100% garantida de banir alguém ou descobrir se aquele player é aquele player, porque qualquer pessoa com qualquer tipo de habilidade simplesmente usará algum tipo de modificador para o sistema e mudará algumas informações e então terá um ID completamente novo, então não há muito que possamos fazer com<br>
<!-- -->isso, podemos fornecer as ferramentas, mas não posso dizer que elas algum dia vão funcionar 100%.</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal, alguém tem mais algo a acrescentar a isso? não? ok, legal</p>
<p><strong>Y_Less:</strong><br>
<!-- -->tenho algo a acrescentar sobre o lado do AC, já que as pessoas estão perguntando um pouco mais sobre isso. então definitivamente não podemos ter um sistema geral de ban porque os servidores são independentes. se um servidor quer manter você e outro servidor quer banir você, isso<br>
<!-- -->cabe ao servidor. se um servidor quer deixar você continuar trapaceando, isso cabe ao servidor.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->eu costumava jogar em um servidor de trapaça e era muito divertido, só quero acrescentar isso</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, então uma lista global de bans não funcionaria por razões assim</p>
<p><strong>Y_Less:</strong><br>
<!-- -->ah, isso é uma ideia terrível, sei que outros mods fizeram isso, isso não significa que seja uma<br>
<!-- -->boa ideia. quanto ao próprio anticheat, ele será separado e sim, você pode atualizá-lo na frequência que quiser.</p>
<p><strong>Potassium:</strong><br>
<!-- -->incrível. certo, recebemos muitas perguntas sobre raknet, acho que as pessoas só querem saber o que vocês pensam sobre ele, se openmp usará a mesma versão que samp usa, blá blá blá</p>
<p><strong>j0sh...:</strong><br>
<!-- -->há uma pequena diferença, mas nada extraordinário, basicamente precisamos da mesma versão major para ele realmente se comunicar perfeitamente com samp</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, a camada de compatibilidade para se comunicar com clients samp existentes é basicamente a mesma.</p>
<p><strong>iAmir:</strong><br>
<!-- -->vai ser mudado, certo? então será mudado depois, por exemplo quando o client openmp for desenvolvido vamos adicionar uma nova biblioteca de networking, então por exemplo outras bibliotecas de networking por aí, cada uma delas provavelmente é melhor que raknet, especialmente a versão que estamos usando agora. então sim, por enquanto vamos usar<br>
<!-- -->raknet na mesma versão que samp usa, apenas para manter a compatibilidade retroativa. fora isso, por exemplo para NPCs em que josh está trabalhando agora, quer dizer, não agora, mas ele estava trabalhando nisso, ele estava usando enet, essa provavelmente é nossa primeira escolha e é muito melhor que raknet, e recebe contribuições com mais frequência, então não temos problemas com exploits ou coisas que apareçam depois, porque todos sabemos que o projeto raknet está<br>
<!-- -->morto, a versão mais recente provavelmente tem seis anos a esta altura. então essa é a única razão pela qual estamos usando raknet agora, vamos mudar isso.</p>
<p><strong>Potassium:</strong><br>
<!-- -->legal, não entendo nada disso, mas obrigada. então houve muita discussão na<br>
<!-- -->thread sobre sync e c-bug e coisas assim, então acho que as pessoas querem saber como será a sync comparada ao samp</p>
<p><strong>JustMichael:</strong><br>
<!-- -->exatamente igual</p>
<p><strong>j0sh...:</strong><br>
<!-- -->exatamente igual, sim. veremos, mas não podemos fazer isso até o client sair, e provavelmente não vou fazer isso porque isso arruinaria a experiência do samp.</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, então houve bastante debate sobre isso, e obviamente também há dentro da equipe.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, eu não concordaria com isso porque meu servidor literalmente depende desses bugs</p>
<p><strong>Southclaws:</strong><br>
<!-- -->as pessoas gostam dessas coisas e já existem formas de parar e prevenir de qualquer maneira, então não acho que seja nossa prerrogativa nos envolver nisso</p>
<p><strong>JustMichael:</strong><br>
<!-- -->acho que no client provavelmente deveríamos ter uma forma de desabilitar esse tipo de bug se o dono do servidor quiser, mas deveria ser uma opção</p>
<p><strong>Southclaws:</strong><br>
<!-- -->você pode desabilitar via scripts pawn de qualquer forma</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, pode</p>
<p><strong>Potassium:</strong><br>
<!-- -->então o consenso sobre isso, só para esclarecer, é que vamos simplesmente deixar como está e<br>
<!-- -->cada servidor pode escolher o que faz com isso. certo?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->basicamente, sim</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, basicamente</p>
<p><strong>Southclaws:</strong><br>
<!-- -->é uma daquelas coisas em que você está ferrado se fizer e ferrado se não fizer, então sim</p>
<p><strong>Y_Less:</strong><br>
<!-- -->de novo, cabe aos servidores. servidores são diferentes, então se quiserem isso, podem ter</p>
<p><strong>Southclaws:</strong><br>
<!-- -->meio como lag comp, algumas pessoas gostam de lag shot, algumas não gostam de lag shot, por isso era uma opção que você podia ligar e desligar</p>
<p><strong>Potassium:</strong><br>
<!-- -->isso mesmo, sim, acho que essa é a melhor forma de lidar com isso. ok, então uma pergunta muito popular tanto no fórum quanto neste chat, que sei que vocês não querem responder, mas vamos lá... samp para android. quais são seus pensamentos sobre isso?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não vamos dar suporte direto, mas vamos dar as ferramentas para que qualquer outra pessoa<br>
<!-- -->possa fazer</p>
<p><strong>Southclaws:</strong><br>
<!-- -->não queremos dar suporte ao samp mobile existente, porque a versão atual existente<br>
<!-- -->do samp mobile é baseada em código roubado. é muito ilegal.</p>
<p><strong>BigETI:</strong><br>
<!-- -->alguém aqui provavelmente quer usar openmp e então fazer seus próprios clients android</p>
<p><strong>Potassium:</strong><br>
<!-- -->então oficialmente, como desenvolvedores do open multiplayer, NÃO é a resposta?</p>
<p><strong>iAmir:</strong><br>
<!-- -->na verdade há algumas coisas nos bloqueando, por exemplo para implementar nossa própria biblioteca em um arquivo APK precisamos modificá-lo, então isso significa que precisamos modificar o arquivo apk do GTA SA<br>
<!-- -->para android, e isso na verdade tem questões legais. então além disso, precisaríamos<br>
<!-- -->modificar algum código no arquivo apk do gta também, então ou seria java assembly ou<br>
<!-- -->faríamos patch no código atual do gta sa, para que ele carregasse nossa própria biblioteca, que seria o client openmp, então para isso, como eu disse, precisaríamos modificar o jogo. e precisaríamos dar às pessoas a versão modificada, o que não é legal, então teríamos problemas legais depois, problemas de copyright depois.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->tecnicamente poderíamos distribuir legalmente o binário para os jogadores e então deixá-los adicionar ao apk deles</p>
<p><strong>Y_Less:</strong><br>
<!-- -->existem versões roubadas do código-fonte por aí, então é nisso que a versão android<br>
<!-- -->é baseada. se quiséssemos usar isso, poderíamos ter usado, poderíamos ter<br>
<!-- -->começado a partir desse código, atualizado o servidor e escrito openmp usando código roubado,<br>
<!-- -->e teria sido muito ilegal, e essa é inteiramente a razão pela qual começamos openmp do zero, zero código-fonte antigo nele, você pode compará-los e eles não são absolutamente nada parecidos. porque de forma alguma apoiamos roubo.</p>
<p><strong>Potassium:</strong><br>
<!-- -->correto, esse é um ponto muito importante para reiterar, não apoiamos código roubado</p>
<p><strong>Y_Less:</strong><br>
<!-- -->e não há NENHUM neste mod.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->isso potencialmente nos colocaria em uma situação muito ruim com questões legais se fôssemos por esse caminho de qualquer forma</p>
<p><strong>Y_Less:</strong><br>
<!-- -->teria saído anos atrás se fizéssemos isso!</p>
<p><strong>Potassium:</strong><br>
<!-- -->agora em uma linha de perguntas parecida, as pessoas querem saber por que deveriam jogar openmp em vez de mta. então sem insultar outros mods, qual é a diferença?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->bem, ainda estamos oferecendo a mesma experiência samp que todo mundo ama, mas acho que agora estamos oferecendo um caminho de atualização. mais recursos no futuro, um possível caminho para todos meio que seguirem em frente, até adicionar as coisas que todos queriam do samp por anos. muita gente saiu do samp porque o samp tem seguido o mesmo caminho por muito tempo, não foi a lugar nenhum, muito pouco foi adicionado. mas agora estamos dando às pessoas a oportunidade de adicionar o que quiserem agora, depois de lançarmos, elas podem adicionar coisas e esse caminho está aberto agora.</p>
<p><strong>Potassium:</strong><br>
<!-- -->alguém tem mais algo a acrescentar?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->mta é ótimo, eu gosto do mta. mta não é um software ruim, não há treta ali, o map editor é ótimo! eu sempre costumava usá-lo. mas há uma diferença cultural entre mta e samp, e não acho que alguém realmente conseguiu descobrir exatamente qual é. mta definitivamente tem recursos melhores, é uma coisa objetivamente melhor que samp, mas as pessoas meio que gostam mais do samp, acho que ele fica mais próximo do jogo.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->eles têm objetivos diferentes</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, objetivos diferentes, mta meio que parece mais garry's mod de certa forma. é mais um tipo sandbox de crie seu próprio jogo multiplayer maluco</p>
<p><strong>Hual:</strong><br>
<!-- -->as pessoas gostam de simplicidade</p>
<p><strong>Southclaws:</strong><br>
<!-- -->e a capacidade de entrar no servidor sem baixar 500 megabytes de skins de anime é sempre uma coisa boa!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->acho que samp e mta atendem mercados ligeiramente diferentes, por que você usaria este em vez de mta é o mesmo motivo pelo qual usaria samp em vez de mta - é essencialmente samp.</p>
<p><strong>Potassium:</strong><br>
<!-- -->o próximo grupo de perguntas é mais sobre a estrutura do mod e da comunidade do que sobre scripting. então as pessoas gostariam de saber se ele será compatível com a versão steam de san andreas porque obviamente, como sabemos, samp não é.</p>
<p><strong>Hual:</strong><br>
<!-- -->deveria ser.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, mta faz isso, tenho certeza de que podemos fazer</p>
<p><strong>j0sh...:</strong><br>
<!-- -->só vai dar bastante trabalho.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->não há razão para não fazer.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->mas se não, existem downgraders de qualquer forma, e existem downgraders há anos. então de qualquer forma não acho que seja um grande problema.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->não, mas deveríamos conseguir, realmente não há razão para não</p>
<p><strong>Potassium:</strong><br>
<!-- -->bem, isso é empolgante!<br>
<!-- -->ok, agora a master list. as pessoas querem saber o que vai acontecer com ela, se teremos uma<br>
<!-- -->lista paga etc. etc. - a lista de servidores</p>
<p><strong>JustMichael:</strong><br>
<!-- -->temos algumas ideias para ela, mas não tenho certeza, ainda não chegamos ao ponto em que dissemos "ok, é isso que vamos fazer"</p>
<p><strong>Southclaws:</strong><br>
<!-- -->quero reiterar que este não é um projeto com fins lucrativos de forma alguma. houve ideias jogadas por aí, porque as pessoas realmente querem uma forma de... sabe, se elas administram um grande servidor e ele é meio como um negócio, então querem uma forma de meio que impulsioná-lo para o topo como uma espécie de investimento, e eu entendo isso e na verdade falei com várias pessoas sobre esse desejo da comunidade de servidores maiores, existem ideias e não acho que estamos prontos para discutir todas elas ainda porque não estão realmente detalhadas. mas tenho trabalhado no novo índice de servidores que está sendo implantado agora. ele basicamente será como samp-servers.net, mas com um backend atualizado, e dará suporte a servidores samp e no futuro a servidores openmp, e será meio como o quadro de anúncios do fórum, mas melhor porque não está em um fórum, mas sim será um site dedicado e será openmp servers ou algo assim, e isso virá em breve. a primeira versão está meio pronta, e também será open source, então você meio que acompanha o desenvolvimento disso e eventualmente isso se transformará na lista. como eu disse, estamos bem no início de decisões assim, e eu realmente não sei qual é o consenso da equipe, mas acho que provavelmente não vamos dividir servidores em duas listas separadas porque isso meio que separa as pessoas entre os ruins e os bons, de certa forma, e meio que cria nós contra eles... não um conflito, mas tipo, sabe, é meio como uma separação</p>
<p><strong>Y_Less:</strong><br>
<!-- -->uma divisão</p>
<p><strong>Southclaws:</strong><br>
<!-- -->e acho que dar aos servidores menores uma chance de conseguir alguma visibilidade também é bom, porque às vezes as pessoas fazem um projeto muito legal e talvez não consigam pagar para entrar na hosted list ou algo assim, então um dos meus objetivos nisso é meio que destacar servidores potencialmente interessantes que não têm alcance. mas no momento será apenas uma lista e você poderá ordená-la por qualquer coisa que quiser e encontrar servidores. essa será a primeira versão.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, o samp no momento é muito enviesado pela hosted tab</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, e é limitada e cara</p>
<p><strong>BigETI:</strong><br>
<!-- -->sim, e é um nome horrível</p>
<p><strong>iAmir:</strong><br>
<!-- -->para nossa própria lista de servidores podemos realmente adicionar algumas opções como avaliações, votação e coisas assim, então pode haver duas seções, por exemplo, uh, uma poderia ser a dos que têm mais avaliações, e a outra poderia ser, por exemplo, um servidor que foi avaliado frequentemente nos últimos dias, então podemos realmente ver as tendências e coisas assim. então novos servidores podem subir e ser vistos por outros jogadores. isso é na verdade uma boa forma para novos servidores que realmente têm uma ideia única poderem ser vistos por outros jogadores e ficarem famosos, é na verdade uma forma melhor do que gastar dinheiro em outras listas ou coisas assim.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então acho que a coisa realmente importante a tirar disso é que somos um projeto sem fins lucrativos, então não vamos criar uma lista de servidores puramente com a intenção de ganhar dinheiro com ela.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->mas isso não significa que não haverá formas de anunciar. e se você tiver ideias sobre isso, poste nos fóruns!</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, e isso é <a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp</a> - cadastrem-se!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->isso é algo que discutimos por tipo dois anos e não temos conclusão</p>
<p><strong>Potassium:</strong><br>
<!-- -->ok, alguém perguntou: o servidor openmp realmente inclui algum tipo de melhoria de desempenho em comparação com o servidor samp? acho que meio que respondemos isso antes na pergunta sobre mta, mas se alguém tiver mais algo a acrescentar...</p>
<p><strong>Hual:</strong><br>
<!-- -->sim, posso só dizer que eu realmente rodei ele em um raspberry pi zero, então sim</p>
<p><strong>iAmir:</strong><br>
<!-- -->sim, você pode hospedar seu próprio servidor enquanto caminha pela rua, tem seu raspberry pi no bolso e ainda está rodando seu servidor samp, então sim, deve ser rápido para isso ser possível</p>
<p><strong>JustMichael:</strong><br>
<!-- -->devemos mencionar que porque estamos usando C++17 há tipo um deployment mínimo para isso, certo?</p>
<p><strong>Hual:</strong><br>
<!-- -->o que você quer dizer?</p>
<p><strong>Y_Less:</strong><br>
<!-- -->não? depende de como você faz o build</p>
<p><strong>JustMichael:</strong><br>
<!-- -->quero dizer requisitos de biblioteca, como bibliotecas do sistema operacional e coisas assim</p>
<p><strong>Southclaws:</strong><br>
<!-- -->Glibc e coisas assim</p>
<p><strong>BigETI:</strong><br>
<!-- -->isso não deve ser um problema</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, não há razão para você não poder fazer build para um sistema diferente</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, você provavelmente está certo, eu estava pensando em edge cases como ark e coisas assim, mas provavelmente vai funcionar de qualquer forma... espera, alguém não fez build para ark já? ah, talvez tenha sido você Hual? talvez tenha sido você fazendo isso para mim?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->ah, você quer dizer arm?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->desculpa, sim, eu disse ark, não disse?</p>
<p><strong>Hual:</strong><br>
<!-- -->então sim, desempenho está ok, compatibilidade está ok</p>
<p><strong>Potassium:</strong><br>
<!-- -->agora a pergunta que todo mundo odeia... 0.3 DL. muita gente, muitos donos de servidores perguntaram se<br>
<!-- -->será compatível no primeiro lançamento para poderem trocar seus servidores imediatamente.</p>
<p><strong>everyone:</strong><br>
<!-- -->sim</p>
<p><strong>BigETI:</strong><br>
<!-- -->essa foi fácil</p>
<p><strong>Potassium:</strong><br>
<!-- -->essa FOI fácil porque da última vez que conversamos sobre isso tivemos opiniões muito divididas e meio que perguntamos à comunidade quais eram as opiniões dela,</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, bem, já sabemos que é possível porque adrian graber escreveu aquele plugin que literalmente engana o client para conectar, então sabemos que podemos fazer</p>
<p><strong>Potassium:</strong><br>
<!-- -->e então, em uma linha parecida, sei que ainda não estamos aceitando perguntas ao vivo, mas alguém no chat fez uma pergunta muito boa: vocês pensaram em fazer uma workshop para openmp, algo como o mta tem para mapas, scripts, plugins etc?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->uh, isso seria muito legal!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, isso seria legal!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->a pergunta é se pensamos nisso? a resposta é não. mas agora vamos pensar!</p>
<p><strong>Potassium:</strong><br>
<!-- -->então obrigada! seguindo, as pessoas queriam saber mais sobre planos futuros. então uma pergunta específica foi "qual é o próximo passo para o openmp depois que ele atingir o fluxo do samp" - então uma vez que tenhamos levado ele à compatibilidade e aonde queremos que esteja, quais são seus planos e ideias futuras?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->acho que depois do lançamento vamos apenas tentar começar com o client, seguir para o segundo lançamento, eu acho. não pensamos muito sobre isso.</p>
<p><strong>Hual:</strong>
provavelmente deveríamos arrumar o servidor primeiro</p>
<p><strong>JustMichael:</strong><br>
<!-- -->provavelmente teremos um período depois do lançamento em que esperamos por relatórios de bugs<br>
<!-- -->e coisas assim e lidamos com isso, porque em qualquer software sempre haverá aqueles edge cases que precisam ser resolvidos, e nenhum software que sai de primeira<br>
<!-- -->vai ser perfeito.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então é justo dizer que o lançamento inicial, e por algum tempo depois, não verá realmente nenhum recurso novo, eles virão mais tarde no futuro talvez?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->ah sim, provavelmente não imediatamente</p>
<p><strong>j0sh:</strong><br>
<!-- -->somos basicamente limitados pelo client, então sem nosso próprio client não podemos fazer muita coisa</p>
<p><strong>Y_Less:</strong><br>
<!-- -->podemos fazer algumas coisas inteligentes, temos alguns truques na manga</p>
<p><strong>Potassium:</strong><br>
<!-- -->fiquem de olho, basicamente!</p>
<p><strong>BigETI:</strong><br>
<!-- -->mas a maioria deles já foi feita de uma forma ou de outra</p>
<p><strong>Potassium:</strong><br>
<!-- -->bem, acho que sempre há algo novo. nessa nota, que tipo de coisas vocês gostariam de eventualmente adicionar quando tudo estiver compatível, os bugs resolvidos e tudo mais, coisas novas que vocês gostariam de ver?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->animações de sexo.</p>
<p><strong>Potassium:</strong><br>
<!-- -->meu deus.</p>
<p><em>todo mundo ri</em></p>
<p><strong>j0sh...:</strong><br>
<!-- -->Eu quero unicode. Quero o emoji de palhaço no chat.</p>
<p><strong>Potassium:</strong><br>
<!-- -->ah sim, emojis no chat!!!</p>
<p><strong>Southclaws:</strong><br>
<!-- -->a capacidade de russos falarem com ingleses no mesmo servidor sem precisar mudar a code page</p>
<p><strong>JustMichael:</strong><br>
<!-- -->sim, isso seria legal</p>
<p><strong>Southclaws:</strong><br>
<!-- -->isso seria ótimo</p>
<p><strong>j0sh...:</strong><br>
<!-- -->isso é revolucionário</p>
<p><strong>Potassium:</strong><br>
<!-- -->isso é revolucionário!</p>
<p><strong>Southclaws:</strong><br>
<!-- -->clustering multi-servidor seria legal, há muitos servidores russos por aí que rodam tipo 20 servidores e estão todos conectados, e você pode imaginar que é bem gambiarra no backend. acho que facilitar isso seria meio interessante, poder trocar de servidor dentro do jogo e coisas assim.</p>
<p><strong>Potassium:</strong><br>
<!-- -->alguém no chat acabou de perguntar: voice chat no openmp?</p>
<p><em>todo mundo ri</em></p>
<p><strong>Southclaws:</strong><br>
<!-- -->você quer crianças de 12 anos gritando com você pela rua? acho que não. existem plugins por aí, e claro com o client e o servidor lançados no futuro, se você quiser fazer plugins de voice chat então vá em frente!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->já existem vários por aí, acho que conheço dois</p>
<p><strong>Southclaws:</strong><br>
<!-- -->acho que eles são closed source, então é meio suspeito</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não, acho que um deles é open source</p>
<p><strong>Y_Less:</strong><br>
<!-- -->tem um que é realmente open source</p>
<p><strong>Southclaws:</strong><br>
<!-- -->bem, aí está, essa é a solução. acho que uma coisa que quero dizer, porém, é que só porque estamos fazendo uma nova plataforma de mod multiplayer do zero para construir em cima, isso não significa que o próprio mod em si precisa ter todos os recursos possíveis enfiados<br>
<!-- -->nele. estamos fazendo uma API de plugins melhor por um motivo, recebemos perguntas como vocês vão adicionar mysql ou vão adicionar sscanf, ou vão adicionar este plugin àquele plugin, e a resposta para a maioria dessas perguntas é não, porque não há razão para isso. na verdade há mais razão para construir mais coisas como plugins porque aí são modulares, você pode adicioná-las e removê-las quando não precisar delas. então acho que o mesmo vale para coisas como<br>
<!-- -->voice chat e coisas de client. vamos fornecer um conjunto melhor de ferramentas para as pessoas realmente aumentarem a experiência e adicionarem coisas novas a ela, e acho que isso é melhor do que encher<br>
<!-- -->com recursos que talvez a maioria das pessoas nem use.</p>
<p><strong>Hual:</strong><br>
<!-- -->sim, mas também como instalar plugins no samp é meio chato, provavelmente deveríamos pensar em ter um registro oficial de plugins onde servidores possam especificar quais plugins de client os clients baixam</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, tipo uma versão client do sampctl, eu suponho. e claro a preocupação aí é sempre poder executar código arbitrário no computador de um usuário, então sabe, acho que ter um repositório seria meio bom</p>
<p><strong>Y_Less:</strong><br>
<!-- -->só algo para ter em mente, metade dos grandes plugins que todo mundo usa, como mysql, streamers, sscanf, tudo isso, os desenvolvedores desses plugins estão NESTA EQUIPE! não vamos simplesmente parar de desenvolvê-los e dizer que você não pode pegar meu plugin agora porque eu escrevi<br>
<!-- -->outra coisa.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então podemos só esclarecer para algumas pessoas perguntando no chat sobre fazer um client. então isso<br>
<!-- -->é um plano futuro, certo? fazer nosso próprio client?</p>
<p><strong>everyone:</strong><br>
<!-- -->sim, essa é a segunda versão</p>
<p><strong>Southclaws:</strong><br>
<!-- -->essa é a parte divertida</p>
<p><strong>Potassium:</strong><br>
<!-- -->as pessoas estavam perguntando sobre outras comunidades que falam línguas diferentes e tal, e meio que querem saber o que estamos fazendo para trabalhar com essas comunidades e como planejamos espalhar a palavra para essas comunidades. acho que é justo dizer que estamos trabalhando nisso, estamos recrutando voluntários, eu acho, para traduzir nossas páginas da wiki e qualquer outra coisa para outros idiomas, para moderar seções de idioma no fórum, <a href="https://forum.open.mp/" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp</a> aliás, e geralmente apenas para serem o ponto de contato entre nossa equipe e as outras comunidades, eu acho</p>
<p><strong>JustMichael:</strong><br>
<!-- -->já fizemos um grande esforço para traduzir a wiki, então estamos fazendo uma melhoria para<br>
<!-- -->tornar mais fácil para essas comunidades se combinarem com a comunidade maior. eu mesmo<br>
<!-- -->já conversei com várias porque conheço muitos servidores da região dos balcãs, eu<br>
<!-- -->na verdade administro um mesmo sem falar a língua, mas aí está. na verdade administro um segundo agora, e um servidor role play, então estive em contato com várias áreas deles e tentei trazer alguns deles, e muitos estão a bordo, muitos donos de servidores dessas áreas estão a bordo, então isso é sempre bom</p>
<p><strong>Southclaws:</strong><br>
<!-- -->fiquei surpreso ao saber que há uma comunidade chinesa, japonesa e taiwanesa bem grande também, que eu nem sabia que existia, então tenho conversado com pessoas dessas comunidades<br>
<!-- -->e ajudado a traduzir e tal.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->descobri que havia uma grande comunidade chinesa e japonesa há cerca de sete segundos, quando você disse isso</p>
<p><strong>Southclaws:</strong><br>
<!-- -->já mencionei isso antes no discord, mas sim, existe de fato uma comunidade grande, o problema sempre foi a barreira linguística, mas as coisas de tradução estão realmente ajudando com isso, o fato de você poder realmente fazer, porque na wiki antiga você não conseguia criar uma<br>
<!-- -->conta por muitos anos por algum motivo, então ninguém conseguia traduzir a wiki</p>
<p><strong>Y_Less:</strong><br>
<!-- -->o motivo é kalcor</p>
<p><strong>Southclaws:</strong><br>
<!-- -->então as pessoas geralmente fazem suas próprias wikis e coisas assim e elas ficam desatualizadas e sim, problemas e problemas. ouvi dizer aparentemente que na tailândia existe na verdade uma única versão traduzida do game mode godfather que todo mundo copia e usa</p>
<p><strong>Y_Less:</strong><br>
<!-- -->já existem várias seções de idioma no discord e nos fóruns. o grande problema que tivemos, porque os fóruns do samp costumavam ter seções de idioma também, o problema<br>
<!-- -->era moderá-las porque se não falamos a língua não sabemos o que vocês estão dizendo. se há problemas, as pessoas fazem denúncias tipo ah, essa pessoa está fazendo algo ruim.<br>
<!-- -->bem, não sabemos, não podemos realmente revisar isso, então adoraríamos entrar em contato com comunidades,<br>
<!-- -->meio que precisamos de pessoas dentro dessas comunidades que falem inglês para fazer a ponte, mas estamos muito interessados em encontrar essas pessoas que estão envolvidas em uma das comunidades de língua<br>
<!-- -->estrangeira e falam inglês, por favor falem conosco!</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, então se vocês conhecem membros confiáveis da comunidade que falam outros idiomas e querem nos ajudar, digam a eles para entrar em contato conosco no nosso fórum, nosso discord, onde for, hum, porque adoraríamos isso</p>
<p><strong>Y_Less:</strong><br>
<!-- -->quer dizer, já temos várias línguas na equipe, falamos inglês ou alemão ou<br>
<!-- -->persa ou...</p>
<p><strong>Potassium:</strong><br>
<!-- -->australiano</p>
<p><strong>Y_Less:</strong><br>
<!-- -->é basicamente isso, sim, australiano, essa é uma língua única... yorkshire...</p>
<p><strong>Hual:</strong>
também estamos bem próximos das comunidades turca e romena,<br>
<!-- -->elas são bem grandes</p>
<p><strong>Y_Less:</strong><br>
<!-- -->e também tenho contatos na comunidade russa.</p>
<p><strong>Potassium:</strong><br>
<!-- -->então estamos tentando.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->é complicado, é difícil, por isso não funcionou antes.</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, e falta de esforço. então a última pergunta meio pré-carregada do fórum hoje<br>
<!-- -->é: o que vocês mais esperam do openmp? e eu achei isso<br>
<!-- -->muito fofo.</p>
<p><strong>everyone:</strong><br>
<!-- -->o lançamento.</p>
<p><strong>Potassium:</strong><br>
<!-- -->depois do lançamento, só em geral. é uma pergunta legal porque fico feliz que as pessoas consigam ver que estamos felizes por fazer isso e animados por fazer. então sim, pelo que vocês estão ansiosos?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->só estou ansioso para chegar a um estado em que ou os jogadores estejam finalmente aproveitando os<br>
<!-- -->recursos, ou cheguemos a um ponto em que o resto da comunidade possa assumir, basicamente isso para ser honesto</p>
<p><strong>Potassium:</strong><br>
<!-- -->mais alguém quer acrescentar algo?</p>
<p><strong>j0sh...:</strong><br>
<!-- -->sem relatórios de bugs</p>
<p><strong>Potassium:</strong><br>
<!-- -->eu honestamente estou meio ansiosa para reunir a comunidade de novo<br>
<!-- -->porque todos nós meio que nos separamos e seguimos caminhos diferentes</p>
<p><strong>JustMichael:</strong><br>
<!-- -->seria legal ter um grande aumento de jogadores, especialmente agora que conversamos<br>
<!-- -->sobre incluir as outras comunidades que seguiram seus próprios caminhos, seria<br>
<!-- -->legal tê-las então, porque sim, sabe, mais jogadores é melhor</p>
<p><strong>Potassium:</strong><br>
<!-- -->nem só contagem de jogadores, só em geral, reunir a comunidade de volta</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, não estamos fazendo isso por causa de um jogo de 15 anos porque o jogo é o melhor jogo de todos, estamos fazendo por causa da comunidade</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, isso mesmo</p>
<p><strong>Southclaws:</strong><br>
<!-- -->NO ENTANTO, ele É o melhor jogo de todos!</p>
<p><strong>JustMichael:</strong><br>
<!-- -->posso confirmar!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->uhhhh vice city é melhor.</p>
<p><strong>Potassium:</strong><br>
<!-- -->liberty city é meu lar, eu sempre vou amar gta 3.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->então a equipe está completamente dividida</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim. mas nessa nota, recebemos muitas perguntas do tipo san andreas é um jogo tão antigo, por que vocês se importam, por que vocês ligam, esse tipo de coisa. e eu só quero responder<br>
<!-- -->essa, ou começar respondendo essa, e dizer que acho importante lembrar que uma grande parte da base de jogadores do samp vem de países onde a tecnologia não é necessariamente tão atualizada ou tão prioritária quanto é onde alguns de nós vivem, e muitos dos nossos jogadores jogam samp porque é um dos únicos jogos que rodam nos pcs deles ou que eles podem pagar, então não sei, eu simplesmente amo muito o fato de podermos dar a eles a capacidade de jogar e criar seus próprios game modes como battle royales ou modos de corrida ou qualquer coisa,<br>
<!-- -->para que todos ainda possam experimentar esse tipo de jogo mesmo que não possam pagar por pubg ou call of duty ou, sabe, não consigam rodar essas coisas</p>
<p><strong>Southclaws:</strong><br>
<!-- -->uma coisa secundária para acrescentar a isso, acho, é o lado de scripting, é como uma droga de entrada de certa forma, é uma porta de entrada para as pessoas aprenderem a programar, e se você aprende a programar isso pode ser ótimo porque você pode fazer coisas e jogos e se divertir, mas também pode conseguir um emprego fazendo isso</p>
<p><strong>Potassium:</strong><br>
<!-- -->há MUITAS pessoas-</p>
<p><strong>Southclaws:</strong><br>
<!-- -->muita gente aqui realmente conseguiu empregos por causa do samp, eu sou um deles. é definitivamente uma<br>
<!-- -->ótima porta de entrada para aprender a programar porque pawn é uma linguagem bem simples, e então você pode passar para C++ para construir plugins e essa é meio que uma linguagem mais complexa, e então pode passar a fazer coisas web como php e javascript por causa de painéis de<br>
<!-- -->controle de usuários e fóruns e tal, e só se expande a partir daí, e essa é uma das principais coisas que eu amo nisso, eu realmente não jogo mais e não escrevo muito código há alguns anos, mas eu simplesmente amo a comunidade, amo ajudar as pessoas com esse lado das coisas, então é por isso que estou nisso</p>
<p><strong>Y_Less:</strong><br>
<!-- -->acho que você pode rastrear a história dos jogos dos últimos 15 anos através dos modos do samp.<br>
<!-- -->qualquer que seja o jogo popular do momento, há uma versão samp dele</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, absolutamente, e eu amo isso!</p>
<p><strong>Y_Less:</strong><br>
<!-- -->pubg - samp. battle royale - samp. microsoft flight simulator samp.</p>
<p><strong>iAmir:</strong>
among us...</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sempre quis escrever um game mode estilo Trouble in Terrorist Town... talvez essa seja nossa próxima stream, fazer um gamemode TTT.</p>
<p><strong>Potassium:</strong><br>
<!-- -->mas sim, só voltando a essa nota, não acho que existam muitos jogos ou comunidades onde você possa fazer esse tipo de coisa, onde você possa ter modos diferentes, talvez roblox...</p>
<p><strong>Southclaws:</strong><br>
<!-- -->garry's mod é tipo a coisa mais próxima, e mesmo assim você precisa de um pc semi-moderno para realmente rodar, e quando entra no servidor geralmente baixa 500 megabytes de skins de anime</p>
<p><strong>Potassium:</strong><br>
<!-- -->toda vez que jogo garry's mod tenho erros de textura e coisas assim, e tenho um pc bom. então enfim, acho que vamos seguir em frente e pegar algumas perguntas ao vivo do chat, então vocês que estão ouvindo...</p>
<p><strong>Y_Less:</strong><br>
<!-- -->só rapidamente antes de você fazer isso, outra coisa relacionada a esse ponto de que estávamos dizendo que muitas pessoas começaram no samp aprendendo a programar com pawn, é uma linguagem bem simples, e muita gente sempre pergunta por que usamos pawn quando é uma linguagem tão simples... e essa é a resposta, usamos porque é uma linguagem simples, qualquer pessoa consegue pegar. é um jogo 18+, mas sejamos honestos, temos muitas crianças jogando, elas chegam e dizem ok, quero fazer meu próprio servidor, como faço isso? bem, primeiro você precisa baixar este editor e estes plugins, e então baixa este outro compilador e estas outras coisas e faz isso e isso e isso, e então isso e então isso e isso, e<br>
<!-- -->então você pode começar a escrever seu primeiro código nesta linguagem horrivelmente conflituosa. elas simplesmente ficam<br>
<!-- -->ah... enquanto com samp era como começo a programar? abre isto, pronto.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->e você já tem um pedaço de código para começar também.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->a barreira de entrada é zero</p>
<p><strong>Potassium:</strong><br>
<!-- -->colocando assim, se eu consigo fazer, qualquer um consegue. e isso não é um exagero!</p>
<p><strong>Southclaws:</strong><br>
<!-- -->Potassium aprende a programar - a série de vídeos. quando isso vai acontecer?</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, eu topo muito isso! mas vocês vão ficar muito bravos.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->na verdade acho que seria uma série realmente boa.</p>
<p><strong>Potassium:</strong><br>
<!-- -->sou muito difícil de ensinar, e também vou chorar. mas tudo bem, acho que isso é bom conteúdo! enfim, vamos pegar algumas perguntas ao vivo do chat, então se vocês no chat têm alguma pergunta, que eu sei que têm...</p>
<p><strong>JustMichael:</strong><br>
<!-- -->alguém acabou de perguntar sobre GetAsyncKeyState</p>
<p><strong>iAmir:</strong>
não tenho certeza se ter isso é realmente uma boa ideia, porque o que o samp faz agora é escutar eventos de teclas, então o que o player mapeou para o próprio jogo gta, então por exemplo quando você pressiona F, se você mudar o botão F para sei lá G, por exemplo, para entrar em veículos, quando eles pressionarem G, isso será chamado no lado do servidor, então o que eles querem e o que estavam perguntando é na verdade enviar todas as teclas, todos os eventos de tecla para o servidor, o que na verdade não é uma boa ideia porque você pode realmente rodar um keylogger ou coisas assim, e vai ter alguns problemas de segurança</p>
<p><strong>Southclaws:</strong><br>
<!-- -->isso também prova que o layout de teclas fica então controlado pelo servidor e não pelo jogador, e isso é meio estranho porque se você gosta de usar um layout de teclado diferente, talvez você goste de usar ESDF, que sei que alguns jogadores de fps realmente usam coisas assim e outros layouts para WASD, se você entra em um servidor e de repente todos os seus botões ficam meio diferentes, então<br>
<!-- -->pode ser meio confuso. então quer dizer, poderíamos adicionar mais teclas que possam ser rebindeadas, mas<br>
<!-- -->acho que usar as teclas do jogo realmente dá aos jogadores a capacidade de personalizar seu tipo de<br>
<!-- -->layout e coisas assim para combinar com eles, não o servidor forçando eles a pressionar F se quiserem usar E para entrar em carros ou algo assim, pegar itens, coisas assim</p>
<p><strong>iAmir:</strong>
acho que como deveríamos lidar com isso é adicionar algumas ações, não teclas, só um monte de ações para que qualquer um possa bindar qualquer coisa a elas</p>
<p><strong>Southclaws:</strong><br>
<!-- -->temos Y e N também que foram adicionados em algum momento, foi H? não lembro, houve algumas teclas novas adicionadas em algum momento. poderíamos fazer coisas assim, havia uma tecla que eu uso... tab é na verdade uma ação de tecla, mas também é o scoreboard, então os usuários não conseguem realmente usá-la, mas se você rebinda tab para algo como R, de repente você tem uma nova tecla para<br>
<!-- -->realmente rebindeá-la no lado do servidor. então há potencial ali.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->sim, uma forma melhor é simplesmente fazer o servidor definir ações e então o client pode pegar essa<br>
<!-- -->lista de ações e apenas atribuir suas próprias teclas, mas ainda assim é só que eles acionaram esta ação, pressionaram esta tecla.</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, e também não permitir que as pessoas bindem todas as teclas do teclado e então façam keylog das pessoas.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->não vai funcionar porque se eles puderem bindar as próprias teclas, podem mudar, então o keylogger é inútil, mas eles acionaram estas ações nesta ordem, que tecla é essa? não sei</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não tenho certeza se isso é uma pergunta direta para nós, mas só diz qual é a quantidade recomendada de rams dedicadas</p>
<p><em>todo mundo ri</em></p>
<p><strong>Potassium:</strong><br>
<!-- -->esse é o jamie</p>
<p><strong>JustMichael:</strong><br>
<!-- -->troll maldito</p>
<p><strong>Southclaws:</strong><br>
<!-- -->foi trollado, mano</p>
<p><strong>iAmir:</strong><br>
<!-- -->então listei algumas perguntas, uma delas era sobre ddos e pessoas atacando outros servidores, o que é muito comum na comunidade espanhola</p>
<p><strong>Potassium:</strong><br>
<!-- -->todas as comunidades</p>
<p><strong>iAmir:</strong><br>
<!-- -->sim, meio que todas as comunidades, mas na comunidade espanhola há um cara, coisas assim</p>
<p><strong>Southclaws:</strong><br>
<!-- -->ah sim, Graber teve que escrever uma coisa estranha de proxy</p>
<p><strong>iAmir:</strong><br>
<!-- -->sim, e as pessoas agora estão perguntando sobre isso, para proteção contra ddos</p>
<p><strong>JustMichael:</strong><br>
<!-- -->não há nada que possamos fazer sobre ddos em si</p>
<p><strong>Southclaws:</strong><br>
<!-- -->a coisa que Graber escreveu e algo em que eu trabalhei, e na verdade você<br>
<!-- -->trabalhou nisso, michael, é um proxy, que é meio estranho de fazer funcionar por causa<br>
<!-- -->de como o samp entre aspas "criptografa" dados, ele usa as portas como uma cifra muito simples, mas se você puder colocar um proxy em outro servidor e então usar round robin dns ou algo assim, isso pode ser uma boa técnica de mitigação, então acho que fornecer as ferramentas para fazer isso seria uma coisa boa</p>
<p><strong>JustMichael:</strong><br>
<!-- -->haveria um problema, porém, se alguém fizesse ddos no próprio load balancer ou proxy, então isso arruinaria tudo para todos os servidores</p>
<p><strong>Southclaws:</strong><br>
<!-- -->sim, mas um proxy load balancer é muito mais leve que o servidor do jogo, então você pode dedicar múltiplas threads para realmente lidar com essa carga, é meio como cloudflare e todos esses serviços de proxy funcionam, então sabe, se você é um servidor grande e tem orçamento, então pode<br>
<!-- -->sabe, alugar um monte de vps, round robin e dns e colocar proxies em todos eles, e então isso meio que absorve a carga e seu servidor real de verdade você pode simplesmente esconder um pouco o endereço ip e ninguém consegue fazer ddos nele diretamente</p>
<p><strong>iAmir:</strong><br>
<!-- -->o resultado da nossa discussão é que se eles estão realmente mirando no servidor em si, não no servidor openmp, por exemplo a máquina em si, se estão mirando nisso com<br>
<!-- -->um stressor ou algum tipo de exploits, coisas assim, você não pode realmente fazer nada sobre isso. podemos corrigir nosso trabalho, mas não podemos corrigir detalhes porque é assim que a internet funciona. se esses são exploits ou stressor ou algum tipo de ferramentas de ddos, coisas assim, se estão<br>
<!-- -->realmente mirando no servidor openmp, podemos encontrar o problema e corrigi-lo o mais rápido possível quando<br>
<!-- -->descobrirmos, mas sobre o servidor em si, a máquina, realmente não há como lidarmos com isso porque não há nada para consertarmos, então isso é realmente trabalho de outras pessoas, comprar proteção contra ddos, ter bons servidores, pagar mais</p>
<p><strong>JustMichael:</strong><br>
<!-- -->isso vem com qualquer pessoa rodando qualquer tipo de aplicação em produção, qualquer tipo de servidor, não é um problema específico nosso</p>
<p><strong>iAmir:</strong><br>
<!-- -->sim, até um site simples, as pessoas podem mirar em um site para derrubar os servidores</p>
<p><strong>Southclaws:</strong><br>
<!-- -->elas podem mirar no seu roteador de casa</p>
<p><strong>Y_Less:</strong><br>
<!-- -->você simplesmente não consegue parar ddos em software, não é possível, eles continuam dizendo como podemos parar ddos, compre proteção contra ddos, é isso.</p>
<p><strong>Hual:</strong><br>
<!-- -->basicamente podemos parar se estiver abusando de um exploit do openmp, caso contrário não há nada que possamos fazer.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->também seria bom se tivéssemos a comunidade reportando isso para garantir que elas realmente reportem esses problemas imediatamente quando os encontrarem, porque isso nos ajudaria<br>
<!-- -->a corrigi-los se algo acontecer</p>
<p><strong>iAmir:</strong><br>
<!-- -->sim, um dos maiores problemas que tivemos no samp foi que as pessoas não conseguiam reportar bugs, havia tipo alguma thread ou discussões e coisas assim e as pessoas reportavam bugs ou adicionavam sugestões e essas mensagens se perdiam em um dia.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->lembro que havia uma thread de bugs que foi deletada tipo três horas depois de ser criada, quando tinha acho que umas 27 ou 30 respostas diferentes nela, todas bugs, e ela simplesmente sumiu</p>
<p><strong>Southclaws:</strong><br>
<!-- -->encontrei um bug onde você podia ler logs remotamente e ninguém se importou com isso e não recebi resposta</p>
<p><strong>Potassium:</strong><br>
<!-- -->não entendo esta pergunta, mas Southclaws: me mandou, então diz: samp não suporta ip failover/alias - openmp vai suportar?</p>
<p><strong>Southclaws:</strong><br>
<!-- -->a razão pela qual samp não suporta isso é porque ele usa a porta e o endereço reais para criptografar seus pacotes, mas você pode simplesmente não fazer isso quando o client sair. enquanto tivermos que usar o servidor samp, estaremos meio presos à criptografia estranha que existe, mas depois disso podemos fazer tipo uma coisa normal de proxy udp. e sim, você também pode fazer failover<br>
<!-- -->para dns.</p>
<p><strong>iAmir:</strong><br>
<!-- -->uh, também há outra pergunta que tenho na minha lista que as pessoas perguntaram no chat, alguém perguntou mais como uma sugestão, podemos considerar dar aos servidores a capacidade de adicionar seu favicon, que é mostrado no client ao lado do título do servidor, por exemplo no launcher. poderíamos fazer isso agora mesmo tendo até algum client ou algum launcher, quero dizer,<br>
<!-- -->sim, com um launcher customizado podemos realmente adicionar uma rule customizada à query e então lemos isso no nosso próprio launcher</p>
<p><strong>Southclaws:</strong><br>
<!-- -->tem o servers.net que escrevi três anos atrás ou dois anos atrás ou algo assim, não lembro, acho que ele realmente tinha suporte para um campo chamado "banner", que deveria ser uma imagem que seria tipo um gráfico que você poderia colocar no fundo da página do seu servidor ou da lista de servidores ou algo assim</p>
<p><strong>JustMichael:</strong><br>
<!-- -->também há o fato de que agora que temos o indexer você adicionou suporte a login para usuários, então eles poderiam facilmente, mesmo sem isso estar no servidor, tecnicamente só fazer login nele e colocar no index e então sim, todos os launchers poderiam simplesmente ir pelo indexer</p>
<p><strong>Southclaws:</strong><br>
<!-- -->o plano com o indexer é basicamente lançar um servidor, você faz login no indexer e o indexer vai te dar um token, tipo um api token, e você coloca esse token no arquivo de configuração do seu servidor e agora o indexer verificou que você é dono daquele servidor, então na interface web do indexer você pode ir e editar a descrição, o ícone, a imagem, qualquer coisa que acabarmos adicionando, gifs, não sei. então você não precisa modificar um arquivo de configuração que está em uma vps, fazer login e upload por ssh, qualquer coisa, você só vai a um site e pode editar com seu navegador e é muito mais simples.</p>
<p><strong>Potassium:</strong><br>
<!-- -->certo, antes de encerrarmos por hoje, as pessoas continuam pedindo para mostrarmos vídeos do progresso. então<br>
<!-- -->não temos isso, não temos vídeos porque não há realmente nada para mostrar no<br>
<!-- -->momento, certo?</p>
<p><strong>JustMichael:</strong><br>
<!-- -->temos feito live streams recentemente e mostrado progresso do openmp</p>
<p><strong>iAmir:</strong><br>
<!-- -->não há realmente nada para mostrar em uma stream ou como vídeo porque é apenas uma aplicação de servidor simples, que é como um console</p>
<p><strong>Hual:</strong><br>
<!-- -->o desenvolvimento é ocasionalmente transmitido no discord</p>
<p><strong>Potassium:</strong><br>
<!-- -->então se vocês entrarem no nosso servidor discord, Southclaws: e outras pessoas frequentemente transmitem o desenvolvimento e coisas assim, o progresso deles, no discord, então você meio que entra no canal do discord e assiste à stream e pode entrar na conversa também, conversar e fazer perguntas. somos bastante abertos com isso e fazemos muita coisa pública em que vocês podem participar.</p>
<p><strong>JustMichael:</strong><br>
<!-- -->alguém acabou de perguntar sobre servidores com custom ui usando htmlcs e js. e nós<br>
<!-- -->falamos muito sobre isso e CEF não fará parte.<br>
<!-- -->hum google adsense hum fontes de<br>
<!-- -->besteira na sua tela sim também bonito<br>
<!-- -->então você tem que trabalhar no xp ah sim sim<br>
<!-- -->sim, também cef não é pequeno<br>
<!-- -->sim teclado sim<br>
<!-- -->vai haver um problema com pessoas<br>
<!-- -->que têm computadores low end<br>
<!-- -->pessoas que têm tipo computadores fracos para<br>
<!-- -->jogar<br>
<!-- -->esse jogo, então se você quiser<br>
<!-- -->saber, pode simplesmente jogar mta<br>
<!-- -->tudo bem, tipo não vamos julgar<br>
<!-- -->quero dizer, eventualmente acho que vamos<br>
<!-- -->ter hum api c<br>
<!-- -->client-side também, certo, então se realmente adicionarmos<br>
<!-- -->isso<br>
<!-- -->e tendo isso, sim josh, quero dizer<br>
<!-- -->não conversamos sobre isso, sim, mas<br>
<!-- -->realmente ter isso é uma boa ideia porque<br>
<!-- -->uh as pessoas podem adicionar voice chat por<br>
<!-- -->conta própria interagindo<br>
<!-- -->com nossa própria api e hum<br>
<!-- -->para coisas como cef, elas podem editar<br>
<!-- -->por conta própria<br>
<!-- -->se adicionarmos api c<br>
<!-- -->então sim, provavelmente é possível<br>
<!-- -->para usuários depois<br>
<!-- -->bem, provavelmente nunca teremos cef<br>
<!-- -->sim, não vamos ter isso embutido, não oficialmente<br>
<!-- -->outra pessoa poderia editar isso não oficialmente<br>
<!-- -->sim<br>
<!-- -->sim, mas não tenho certeza se aceitaríamos isso no<br>
<!-- -->registro de plugins oficiais também, então<br>
<!-- -->não sei, sim, há coisas<br>
<!-- -->alguém perguntou se temos um mapa oficial e editor de modelos<br>
<!-- -->uh sim, temos um amir trabalhando em um visualizador<br>
<!-- -->de modelos<br>
<!-- -->uh não tenho certeza<br>
<!-- -->sim, legal<br>
<!-- -->certo, uh e realmente não<br>
<!-- -->discutimos isso então<br>
<!-- -->poderíamos dizer ah gostaríamos de um, o que<br>
<!-- -->é verdade, mas não há planos de fazer um<br>
<!-- -->porque já existem alguns e eles<br>
<!-- -->funcionam e são ok e todo mundo<br>
<!-- -->conhece</p>
<p><strong>Potassium:</strong><br>
<!-- -->acho que vamos encerrar por aqui porque acho que respondemos muitas perguntas, mas sabe, se você tiver mais perguntas, por favor vá ao nosso fórum ou ao nosso discord e pergunte lá, porque queremos respondê-las.</p>
<p><strong>Y_Less:</strong><br>
<!-- -->algumas pessoas estão preocupadas por não serem falantes nativos e não entenderem o que conversamos, então vamos tentar escrever tudo</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, vou tentar colocar uma transcrição no ar e então nossos contatos incríveis em outras comunidades podem traduzir para nós, isso seria ótimo</p>
<p><strong>BigETI:</strong><br>
<!-- -->quero dizer, se você enviar para o youtube, isso deve ser relativamente fácil</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, esse é o plano, vamos colocar isso no youtube, e vou tentar colocar em alguma<br>
<!-- -->plataforma de podcast também para que as pessoas possam ouvir</p>
<p><strong>Southclaws:</strong><br>
<!-- -->tenho certeza de que o youtube também vai gerar algumas legendas muito hilárias</p>
<p><strong>Potassium:</strong><br>
<!-- -->então, como dissemos, pretendemos fazer streams regularmente de agora em diante, não só sessões de q&amp;a, mas<br>
<!-- -->gostaríamos de transmitir o progresso do desenvolvimento, acho que conversamos sobre fazer alguns jogos comunitários, tipo coisas como among us e outros jogos que poderíamos jogar todos juntos, então sigam este canal, entrem no nosso discord, inscrevam-se no youtube, sigam nosso twitter,<br>
<!-- -->facebook, instagram, cadastrem-se no nosso fórum, todas essas coisas boas, tudo está linkado</p>
<p><strong>iAmir:</strong><br>
<!-- -->você esqueceu vk</p>
<p><strong>Potassium:</strong><br>
<!-- -->sim, vk</p>
<p><strong>Southclaws:</strong><br>
<!-- -->também tem um reddit</p>
<p><strong>Potassium:</strong><br>
<!-- -->tudo deve estar linkado abaixo, senão temos um linktree, acredito que é linktr.ee/openmultiplayer, tudo está linkado lá, mas sim, acho que obrigada a vocês pelo tempo, obrigada a todos os espectadores por assistirem, ou melhor, ouvirem, o link do link tree está no chat da twitch agora, uh uma pergunta rápida a mais, há planos de abrir um patreon para pessoas que querem apoiar o projeto?</p>
<p><strong>everyone:</strong><br>
<!-- -->não discutimos realmente nada assim<br>
<!-- -->doações são sempre boas, mas não precisamos muito delas agora<br>
<!-- -->sim, no momento não precisamos delas<br>
<!-- -->acho que sim, quero dizer, coisas como os custos do servidor e qualquer coisa seriam legais<br>
<!-- -->são bem baratos<br>
<!-- -->o indexer provavelmente custa tipo cinco dólares por mês, é quase nada<br>
<!-- -->sim, sim, e os sites são todos hospedados de graça<br>
<!-- -->sim, talvez talvez no futuro abramos algum tipo de forma para vocês<br>
<!-- -->apoiarem o projeto se quiserem, mas sabe, não estamos fazendo isso para ganhar dinheiro, então isso é algo que discutiremos<br>
<!-- -->também é meio como se você estivesse se comprometendo ainda mais e não acho que podemos simplesmente fazer isso<br>
<!-- -->porque todos trabalhamos para viver</p>
<p><strong>Potassium:</strong><br>
<!-- -->certo, bem, muito obrigada a vocês por estarem aqui e por responderem todas essas perguntas,<br>
<!-- -->e obrigada ao chat da twitch por estar aqui, seguir e tudo mais, vemos vocês no discord</p>
<p><strong>everyone:</strong><br>
<!-- -->obrigado por nos receber</p>
<p><strong>Potassium:</strong><br>
<!-- -->de nada, até mais pessoal!</p>]]></content>
        <author>
            <name>Potassium</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Design da API do open.mp]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/scripting-api</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/scripting-api"/>
        <updated>2020-04-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Um foco principal do open.mp é manter a compatibilidade retroativa — seus scripts SA:MP existentes continuarão funcionando como estão. No entanto, o open.mp também introduz melhorias para corrigir inconsistências e tornar a criação de scripts mais intuitiva e poderosa.]]></summary>
        <content type="html"><![CDATA[<p>Um foco principal do open.mp é manter a <strong>compatibilidade retroativa</strong> — seus scripts SA<!-- -->:MP<!-- --> existentes continuarão funcionando como estão. No entanto, o open.mp também introduz melhorias para corrigir inconsistências e tornar a criação de scripts mais intuitiva e poderosa.</p>
<p>Veja alguns problemas comuns do SA<!-- -->:MP<!-- --> que estamos abordando e como o open.mp melhora a experiência.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>aviso</div><div class="admonitionContent_BuS1"><p>O conteúdo do post a seguir está desatualizado e não tem relação com o estado atual do open.mp. O post está publicado aqui para fins de arquivo.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introdução">Introdução<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#introdu%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para Introdução" title="Link direto para Introdução" translate="no">​</a></h2>
<p>Primeiro, um esclarecimento MUITO importante: scripts existentes ainda funcionarão como estão. Trabalhamos muito duro na compatibilidade retroativa e a levamos em consideração em todas as decisões. Há muitas melhorias que gostaríamos de fazer, mas simplesmente não podemos por esse motivo, além de outros códigos que ficam muito mais complicados por causa desse requisito de compatibilidade.</p>
<p>Dito isso, há melhorias que podem ser feitas em todos os lugares. Vamos ver alguns exemplos de inconsistências nos scripts SA:MP:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tags">Tags<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#tags" class="hash-link" aria-label="Link direto para Tags" title="Link direto para Tags" translate="no">​</a></h3>
<ul>
<li class=""><code>Menu:CreateMenu</code> - Com tag.</li>
<li class=""><code>DB:db_open</code> - Com tag.</li>
<li class=""><code>CreateVehicle</code> - Sem tag.</li>
<li class=""><code>CreateActor</code> - Sem tag.</li>
</ul>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">SELECT_OBJECT_GLOBAL_OBJECT</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">SELECT_OBJECT_PLAYER_OBJECT</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property expression number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">forward </span><span class="token function" style="color:#d73a49">OnPlayerSelectObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> modelid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">fX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">fY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">fZ</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><code>type</code> não tem tag, assim como TODAS as constantes definidas pelo SA<!-- -->:MP<!-- -->; diferente das constantes padrão do pawn:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">native File</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">fopen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> filemode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">mode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> io_readwrite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nomeação">Nomeação<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#nomea%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para Nomeação" title="Link direto para Nomeação" translate="no">​</a></h3>
<ul>
<li class=""><code>SetVehiclePos</code> - "Vehicle" no meio do nome da função.</li>
<li class=""><code>TextDrawTextSize</code> - "TextDraw" no começo.</li>
<li class=""><code>db_open</code> - "db" no começo e em minúsculas.</li>
<li class=""><code>fread</code> - "file" no começo, e abreviado.</li>
<li class=""><code>asin</code> - Uma função adicionada pelo SA<!-- -->:MP<!-- --> sem camel/pascal case.</li>
</ul>
<p>Consistência:</p>
<ul>
<li class="">GetVehicleZAngle - "Z-Angle"</li>
<li class="">GetVehicleRotationQuat - "Rotation"</li>
<li class="">SetPlayerFacingAngle - "Facing Angle"</li>
<li class="">SetObjectRot - "Rot"</li>
</ul>
<p>E apesar de tudo isso, a maioria das bibliotecas agora adotou a convenção de nomenclatura <code>Module_Method</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="constantes">Constantes<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#constantes" class="hash-link" aria-label="Link direto para Constantes" title="Link direto para Constantes" translate="no">​</a></h3>
<ul>
<li class=""><code>65535</code></li>
</ul>
<p>Valor para jogadores, atores, TDs e algumas outras coisas inválidas. Também é o valor para veículos inválidos, mas <code>0</code> TAMBÉM é um ID de veículo inválido às vezes retornado.</p>
<ul>
<li class=""><code>0</code></li>
</ul>
<p>Valor para arquivos inválidos, às vezes veículos (assim como <code>65535</code>). Também é o valor para a ausência de muitas coisas, como estados de ação e armas.</p>
<ul>
<li class=""><code>255</code></li>
</ul>
<p>Valor para times e menus inválidos.</p>
<ul>
<li class=""><code>-1</code></li>
</ul>
<p>Valor para gang zones e estados de arma inválidos.</p>
<p>Além disso, muitas bibliotecas usam <code>0x80000000</code> e <code>-1</code> para estados inválidos porque é muito menos provável que eles acabem se tornando um ID válido. 65535 é um número bem grande, mas um servidor grande pode facilmente ter mais objetos do que isso.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="funções-por-jogador">Funções por jogador<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#fun%C3%A7%C3%B5es-por-jogador" class="hash-link" aria-label="Link direto para Funções por jogador" title="Link direto para Funções por jogador" translate="no">​</a></h3>
<ul>
<li class=""><code>CreateObject</code> e <code>CreatePlayerObject</code></li>
</ul>
<p>Tem versões globais e por jogador.</p>
<ul>
<li class=""><code>SetPlayerMapIcon</code></li>
</ul>
<p>Não tem versão global.</p>
<ul>
<li class=""><code>SetGravity</code></li>
</ul>
<p>Sem versão por jogador, apesar de possivelmente ser uma das funções por jogador mais solicitadas, e adicionada quase instantaneamente pelo YSF e outros plugins.</p>
<ul>
<li class=""><code>CreateVehicle</code></li>
</ul>
<p>Sem versão por jogador, apesar de também ser solicitada repetidamente. Mas também não foi adicionada por nenhum plugin (público), nem mesmo pelo plugin streamer.</p>
<ul>
<li class=""><code>SendClientMessage</code> e <code>SendClientMessageToAll</code></li>
</ul>
<p>Tem versões globais e por jogador, mas a versão por jogador é o padrão, diferente da maioria das outras funções.</p>
<ul>
<li class=""><code>GangZoneShowForPlayer</code> e <code>GangZoneShowForAll</code></li>
</ul>
<p>Menus, Gang Zones e Text Draws são as únicas funções padrão do SA<!-- -->:MP<!-- --> em que você pode especificar exatamente quais jogadores podem vê-los. Todas as outras são para todo mundo ou apenas uma pessoa. Claro, bibliotecas e plugins desde então expandiram muito esse modelo, e a maioria dos bons agora permite controle muito granular sobre quais subconjuntos de jogadores (grupos) podem usar qualquer entidade específica.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ids">IDs<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#ids" class="hash-link" aria-label="Link direto para IDs" title="Link direto para IDs" translate="no">​</a></h3>
<ul>
<li class=""><code>CreateObject</code> e <code>CreatePlayerObject</code></li>
</ul>
<p>O pool de IDs dessas funções é compartilhado. Se um objeto global tiver ID <code>4</code>, nenhum objeto de jogador poderá ter ID <code>4</code>, mas vários jogadores poderiam ter objetos diferentes todos com ID <code>5</code>.</p>
<ul>
<li class=""><code>Create3DTextLabel</code> e <code>CreatePlayer3DTextLabel</code></li>
</ul>
<p>O pool de IDs é dividido: os primeiros <code>1024</code> IDs são globais, os segundos <code>1024</code> são por jogador. Cada jogador pode ter até <code>2048</code> textos 3D, mas apenas <code>1024</code> de cada tipo, apesar de isso não fazer diferença nenhuma no lado do cliente.</p>
<ul>
<li class=""><code>SetPlayerMapIcon</code></li>
</ul>
<p>Os IDs são especificados manualmente, até o limite de 32. Por um tempo esse limite não era verificado no lado do cliente, levando a um possível exploit de ACE.</p>
<ul>
<li class=""><code>ShowPlayerDialog</code></li>
</ul>
<p>Os IDs são especificados manualmente, sem limite algum. Os IDs também são totalmente inúteis, já que um jogador só pode ver um diálogo por vez.</p>
<ul>
<li class=""><code>SetTimer</code></li>
</ul>
<p>Os IDs dão a volta, sem verificar se um timer existente tem o mesmo ID. Você teria que iniciar mais de 4.000.000.000 timers em algum momento para encontrar esse problema, mas ele poderia acontecer — eles nem precisam continuar todos rodando.</p>
<p>E, claro, algumas pessoas dependem de IDs serem alocados em ordens muito específicas, e depois se perguntam por que o modo inteiro quebra quando, por exemplo, adicionam ou removem um único veículo.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compatibilidade">Compatibilidade<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#compatibilidade" class="hash-link" aria-label="Link direto para Compatibilidade" title="Link direto para Compatibilidade" translate="no">​</a></h2>
<p>Então, novamente, precisamos deixar muito claro que todo <em>"código SA<!-- -->:MP<!-- -->"</em> existente funcionará. O que isso significa exatamente? Qualquer código que seja:</p>
<ul>
<li class="">Escrito em pawn.</li>
<li class="">Use a API original do SA<!-- -->:MP<!-- --> sem plugins.</li>
<li class="">Seja recompilado com nossos includes.</li>
<li class="">Já use o compilador da comunidade.</li>
</ul>
<p>Vai funcionar.</p>
<p>No entanto:</p>
<ul>
<li class="">Se você usa um plugin para escrever em uma linguagem diferente de pawn, esse plugin provavelmente precisará ser portado primeiro. Então seu código não funcionará imediatamente.</li>
<li class="">Se você usa outros plugins, como streamer, YSF, audio etc.; eles podem já funcionar, podem precisar de portabilidade, ou podem ser totalmente supérfluos porque sua funcionalidade foi integrada ao servidor principal. Então seu código pode funcionar.</li>
<li class="">Se você só tem o .AMX do seu modo e não o código-fonte original, por quê? De qualquer forma, embora todas as funções SA<!-- -->:MP<!-- --> existam, algumas foram refeitas ou substituídas por código pawn ou macros, e você DEVE recompilar. Então, se você não puder, seu código não funcionará de jeito nenhum.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build">Build<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#build" class="hash-link" aria-label="Link direto para Build" title="Link direto para Build" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exemplo">Exemplo<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#exemplo" class="hash-link" aria-label="Link direto para Exemplo" title="Link direto para Exemplo" translate="no">​</a></h3>
<p>Vamos começar vendo um modo SA<!-- -->:MP<!-- --> absurdamente simples.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;a_samp&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">public </span><span class="token function" style="color:#d73a49">OnGameModeInit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SetGameModeText</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Example Script"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">AddPlayerClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">public </span><span class="token function" style="color:#d73a49">OnPlayerSpawn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">public </span><span class="token function" style="color:#d73a49">OnPlayerEnterCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SendClientMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xFF0000AA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"You won!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Você nasce. Vai até o checkpoint. Você vence.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conversão">Conversão<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#convers%C3%A3o" class="hash-link" aria-label="Link direto para Conversão" title="Link direto para Conversão" translate="no">​</a></h3>
<p>Para fazer o build disso para open.mp, precisamos mudar apenas o primeiro include e adicionar um define.</p>
<p>Isto:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;a_samp&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Vira:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">OPENMP_COMPAT</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;openmp\openmp&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>O primeiro erro que você pode receber é:</p>
<p><code>open.mp scripts require the community compiler from: git.io/pawn-compiler</code></p>
<p>Se você receber isso, vá para <a href="https://git.io/pawn-compiler" target="_blank" rel="noopener noreferrer" class="">https://git.io/pawn-compiler</a> e baixe a versão 3.10.10 ou posterior do compilador. Para o lançamento, gostaríamos de uma ferramenta equivalente ao pawno com esse compilador já integrado, mas ainda não fizemos isso. Eu recomendo FORTEMENTE tentar compilar seu modo com esse compilador primeiro, pois ele reativou os avisos de correção de const, então é provável que você receba uma porção de novos avisos logo de cara (isso NÃO é um problema do compilador; são problemas no seu código que sempre existiram, mas eram ignorados antes). Você provavelmente também vai querer substituir seus includes por estes:</p>
<p><a href="https://github.com/pawn-lang/pawn-stdlib" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/pawn-stdlib</a><br>
<a href="https://github.com/pawn-lang/samp-stdlib" target="_blank" rel="noopener noreferrer" class="">https://github.com/pawn-lang/samp-stdlib</a></p>
<p>Isso é uma coisa boa a fazer mesmo se você não usa open.mp, pois eles corrigem vários problemas de tags e const nos includes originais.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="avisos">Avisos<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#avisos" class="hash-link" aria-label="Link direto para Avisos" title="Link direto para Avisos" translate="no">​</a></h3>
<p>Se você não receber nenhum aviso usando o novo compilador com a nova versão de <code>a_samp</code>, agora verá uma porção de novos avisos parecidos com:</p>
<p><code>warning 234: function is deprecated (symbol "AddPlayerClass") Use "Class_Add" instead.</code></p>
<p>Você tem três opções — e todas são suportadas:</p>
<ul>
<li class=""><strong>Ignorar os avisos:</strong> O código ainda funcionará.</li>
<li class=""><strong>Suprimir os avisos:</strong> Troque <code>OPENMP_COMPAT</code> por <code>OPENMP_QUIET</code>:</li>
</ul>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">define</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property macro-name" style="color:#36acaa">OPENMP_QUIET</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;openmp\openmp&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Corrigir os avisos:</strong> Algumas funções mudaram de nome para ficarem consistentes entre si; algumas funções mudaram parâmetros porque as antigas evoluíram e não expunham totalmente as capacidades do open.mp. Ainda não há uma forma simples de converter todas as funções, mas você pode deixar os avisos ligados enquanto converte o código aos poucos — as funções antigas continuarão funcionando perfeitamente bem.</li>
</ul>
<p>Há três estágios na conversão:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-openmp_quiet"><code>#define OPENMP_QUIET</code><a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#define-openmp_quiet" class="hash-link" aria-label="Link direto para define-openmp_quiet" title="Link direto para define-openmp_quiet" translate="no">​</a></h3>
<p>Usar esse define permite que seu modo compile sem novos avisos de funções obsoletas. Mas você não deve ficar com esse define, e as conversões implícitas só funcionarão para código pawn. Você pode converter código nesse modo, já que a nova API também funcionará, mas não pode usar o compilador para ver onde ainda restam problemas.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-openmp_compat"><code>#define OPENMP_COMPAT</code><a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#define-openmp_compat" class="hash-link" aria-label="Link direto para define-openmp_compat" title="Link direto para define-openmp_compat" translate="no">​</a></h3>
<p>Este é o segundo estágio. Quando você quiser começar a aproveitar todos os recursos melhorados do open.mp, como controles granulares de entidades por jogador e limites removidos, precisará começar a usar as novas versões das funções. As novas funções estão sempre disponíveis, mas talvez você não saiba todos os lugares que precisam de conversão. Isso dará avisos para as funções antigas, mas elas ainda funcionarão, permitindo converter partes do seu modo uma de cada vez.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sem-define">Sem define<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#sem-define" class="hash-link" aria-label="Link direto para Sem define" title="Link direto para Sem define" translate="no">​</a></h3>
<p>Quando você achar que terminou de converter seu código, remova os defines:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">&lt;openmp\openmp&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Agora você recebe erros em vez de avisos para qualquer código antigo ainda em uso.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nova-api">Nova API<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#nova-api" class="hash-link" aria-label="Link direto para Nova API" title="Link direto para Nova API" translate="no">​</a></h2>
<p>Agora que vimos quais eram os problemas da API antiga e como encontrar onde você precisa aplicar a nova API, devemos de fato olhar para essa nova API em termos dos problemas identificados anteriormente:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tags-1">Tags<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#tags-1" class="hash-link" aria-label="Link direto para Tags" title="Link direto para Tags" translate="no">​</a></h3>
<p>As funções agora usam tags quase em todos os lugares. Tentamos encontrar um equilíbrio entre avisos de tags demais e pouca informação útil, mas avisos existem por um motivo e podem ajudar a encontrar problemas que você talvez tenha deixado passar. Por exemplo, passar um veículo como parâmetro para uma função de objeto, ou dar a alguém uma arma que não existe:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Nenhum aviso para este código, apesar de ele estar claramente errado.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">new object </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CreateObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">various</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> parameters</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> here</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">PutPlayerInVehicle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// O mesmo aqui - não existe arma 20, apesar de estar entre IDs de armas válidos.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">GivePlayerWeapon</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Seria muito melhor se todos os trechos de código claramente errados pudessem gerar avisos. Esse é o poder de uma linguagem type-safe, e embora pawn não seja totalmente type-safe, podemos chegar perto com tags. Esses exemplos viram:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// warning 213: tag mismatch: expected tag "Vehicle", but found "Object"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">new Object</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">object </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Object@</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">various</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> parameters</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> here</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Player_PutInVehicle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// warning 213: tag mismatch: expected tag "WeaponType", but found but found none ("_")</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">GivePlayerWeapon</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Isto não gera aviso:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">GivePlayerWeapon</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WEAPON_COLT45</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nomeação-1">Nomeação<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#nomea%C3%A7%C3%A3o-1" class="hash-link" aria-label="Link direto para Nomeação" title="Link direto para Nomeação" translate="no">​</a></h3>
<p>A maioria das novas funções usa um refinamento do esquema de nomes já adotado por muitas bibliotecas e plugins: <code>Module_VerbNoun</code>. Algumas não usam, quando são casos isolados que não se encaixam em nenhum módulo maior, mas na maior parte você possivelmente consegue adivinhar o nome de uma função de que precisa. Chega de ficar se perguntando se era "Rot" ou "Rotation" para esse tipo de elemento; não há abreviações, a menos que o nome da função fique longo demais (32+ caracteres, o compilador não aceita). Quer mudar o modelo de um objeto? <code>Object_SetModel</code>. Quer mostrar texto para um jogador? <code>Text_Show</code>.</p>
<p>Há um conjunto limitado de verbos: <code>Get</code>, <code>Set</code>, <code>Create</code>, <code>Destroy</code>, <code>Add</code>, <code>Remove</code>, <code>Show</code>, <code>Hide</code>, <code>Run</code>, <code>Move</code>, <code>Stop</code> e <code>Count</code>. Mais podem ser adicionados e podem aparecer em situações especiais, mas, em geral, se um desses se encaixa, provavelmente é ele. De longe os mais comuns são <code>Get</code> e <code>Set</code>, que, diferente do SA<!-- -->:MP<!-- -->, agora sempre vêm em pares: se você pode definir qualquer parâmetro, também pode obtê-lo depois. Eles também são os verbos que mais frequentemente vêm com um substantivo — você precisa especificar o que obter ou definir: <code>Health</code>, <code>Position</code>, <code>Model</code>, <code>Width</code> etc.</p>
<p>Alguns exemplos:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Menu_SetDisabled</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Menu</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">menuid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bool</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">disabled</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Menu_GetDisabled</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Menu</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">menuid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Text_SetAlignment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> alignment</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Text_GetAlignment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">text</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Object_Move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Object</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">posX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">posY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">posZ</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">speed</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">rotX </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> FLOAT_NAN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">rotY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> FLOAT_NAN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">rotZ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> FLOAT_NAN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">DBResult_CountRows</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">DBResult</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">dbresult</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Player_Spawn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Observe que os nomes de módulo e tag sempre correspondem — <code>Vehicle</code>, <code>DB</code>, <code>Player</code> etc. <a href="https://github.com/pawn-lang/compiler/issues/234" target="_blank" rel="noopener noreferrer" class="">Há motivos além da consistência para isso</a>: dá uma interface mais parecida com OO e é mais fácil de lembrar. No entanto, você talvez tenha notado em um exemplo anterior a função <code>Object@Create</code>, não <code>Object_Create</code>. A razão para isso está no primeiro parâmetro.</p>
<p>Em todos os sete exemplos imediatamente acima, o primeiro parâmetro é a entidade (objeto, veículo, jogador etc.) sobre a qual a operação é realizada. Você quer obter a posição de uma entidade específica. Quer mover uma entidade específica. Quer obter o tempo restante de uma entidade específica. Isso novamente mapeia para a API parecida com OO: <code>Player_Spawn(playerid)</code> pode ser pensado como <code>player.Spawn()</code>. PAWN não pode fazer isso, mas isso não significa que outras linguagens conectadas a essa API não possam. Em termos de C++: <code>_</code> é <code>.</code> ou <code>-&gt;</code> e sempre precisa de um ID válido dado como primeiro parâmetro. No entanto, a função <code>Dialog_IsValid(Dialog:id)</code>, por definição, pode não ter um ID válido como primeiro parâmetro (ou qual seria o propósito dela<sup><a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#user-content-fn-1-31ff2b" id="user-content-fnref-1-31ff2b" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>?), e <code>Icon_Create(image, Float:x, Float:y, Float:z)</code> nem sequer recebe um ID. Assim, elas viram <code>@</code> — <code>::</code> na sintaxe de C++. Elas podem nem receber um ID, e definitivamente não precisam de um válido (<code>@Destroy</code> também entra nesse grupo de funções, já que destruir uma entidade é uma operação logicamente externa a uma entidade, não uma operação sobre a entidade).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="constantes-1">Constantes<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#constantes-1" class="hash-link" aria-label="Link direto para Constantes" title="Link direto para Constantes" translate="no">​</a></h3>
<p>Para começar, em vez de <code>#define</code> para tudo, usamos <code>const</code> e <code>enum</code> tanto quanto possível, exceto onde esperamos que coisas sejam sobrescritas (<code>MAX_PLAYERS</code>):</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token class-name">ObjectMaterialTextAlignment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    MATERIAL_TEXT_ALIGN_LEFT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    MATERIAL_TEXT_ALIGN_CENTRE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    MATERIAL_TEXT_ALIGN_RIGHT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><code>Object_SetMaterialText</code> agora aceitará apenas um desses três valores, e nada mais.</p>
<p>E quanto aos IDs inválidos? Também os tornamos consistentes. Todas as entidades agora usam o mesmo valor inválido, bem fora do intervalo de valores possivelmente válidos — o open.mp removeu quase todos os limites, então tornar um valor como <code>65536</code> inválido simplesmente não funcionará. Qual é esse novo valor inválido? Ainda não decidimos... Há dois principais candidatos, ambos com prós e contras, e a decisão não é tão fácil quanto pode parecer à primeira vista. Mas felizmente isso não faz grande diferença para o trabalho interno, já que podemos trocar quase instantaneamente.</p>
<p>As duas escolhas são explicadas abaixo, e gostaríamos de receber feedback sobre isso se possível:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="0"><code>0</code><a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#0" class="hash-link" aria-label="Link direto para 0" title="Link direto para 0" translate="no">​</a></h4>
<p>Usar <code>0</code> como valor inválido tem algumas vantagens:</p>
<ul>
<li class="">ele não é um índice inválido, então, quando retornado e não verificado corretamente, seu código não vai travar. Talvez não funcione perfeitamente, mas pelo menos continuará fazendo alguma coisa.</li>
<li class="">É muito fácil de verificar, e a intenção fica óbvia com ele:</li>
</ul>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">new Object</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">object </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Object@</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">various</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> parameters</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> here</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Object_SetMaterialText</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">object</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Couldn't create the object."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<ul>
<li class="">Uma variável recém-declarada é, por padrão, um valor inválido:</li>
</ul>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">new Dialog</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">d</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Um dos bugs mais comuns que as pessoas encontram é o código só funcionar para o jogador 0, porque esqueceram de inicializar uma variável. Se não houver jogador/objeto/veículo 0, o código não será aplicado a ninguém — é melhor não promover nenhum jogador a admin do que promover o jogador errado.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-1"><code>-1</code><a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#-1" class="hash-link" aria-label="Link direto para -1" title="Link direto para -1" translate="no">​</a></h4>
<p>Usar <code>-1</code> como valor inválido tem algumas vantagens:</p>
<ul>
<li class="">Ele É um índice inválido. Não ser um foi listado como vantagem para <code>0</code> porque seu código muitas vezes continuará rodando em vez de travar, mas com crashdetect isso pode ser bom — há um bug no seu código e o crash dirá exatamente onde ele está, às vezes até a linha exata do código-fonte. O que é melhor: continuar silenciosamente ou terminar de forma barulhenta?</li>
<li class="">As pessoas estão acostumadas a <code>0</code> como valor válido na maior parte do tempo. Programadores começam a contar em <code>0</code>, então ele deveria ser válido, e algo fora do domínio dos inteiros positivos deveria ser inválido.</li>
<li class="">Em matemática sem sinal, ele é o maior inteiro possível: <code>0xFFFFFFFF</code>, <code>4294967295</code>. Isso significa que o limite interno rígido para qualquer tipo de entidade é o maior possível: <code>4,294,967,295</code> itens antes de ficar sem IDs (e memória).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="funções-por-jogador-1">Funções por jogador<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#fun%C3%A7%C3%B5es-por-jogador-1" class="hash-link" aria-label="Link direto para Funções por jogador" title="Link direto para Funções por jogador" translate="no">​</a></h3>
<p>Em resumo, elas não existem mais. Toda função <code>ForPlayer</code>, <code>ForAll</code>, <code>CreatePlayerX</code> etc. foi substituída por uma função simples: <code>X_Display</code> (onde <code>X</code> é qualquer entidade), e <code>X_Has</code> para verificação:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">Object_Display</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Mostra.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Object_Display</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Oculta.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Text_Display</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">textid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Mostra para todos.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Zone_Has</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">zoneid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// O jogador TEM PERMISSÃO para ver a gang zone.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>YSI usava <code>X_SetPlayer</code>, mas mostrar coisas para jogadores é a coisa mais fundamental a fazer, então merece seu próprio verbo. Algumas bibliotecas usam <code>X_Show</code> e <code>X_Hide</code>, mas isso são duas funções, o que só leva a código extra ao verificar qual usar:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">var</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Checkpoint_Show</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cpid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Checkpoint_Hide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cpid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>vs</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">Checkpoint_Display</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cpid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> var</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Observe que apenas chamar <code>X_Display</code> pode não mostrar o item de fato. Um objeto do outro lado do mundo ainda não ficará visível. Um checkpoint em outro mundo virtual não ficará visível mesmo que esteja bem ao seu lado. Para entidades do mundo, isso apenas diz que o jogador tem permissão para vê-la, não que ele atualmente consegue vê-la. Por outro lado, para elementos de HUD como menus e diálogos, isso os mostra instantaneamente e pode ocultar outros quando apenas um é permitido.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ids-1">IDs<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#ids-1" class="hash-link" aria-label="Link direto para IDs" title="Link direto para IDs" translate="no">​</a></h3>
<p>Com a remoção dos pools por jogador e a unificação dos IDs inválidos, isso não é mais um problema.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="funções-mais-inteligentes">Funções mais inteligentes.<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#fun%C3%A7%C3%B5es-mais-inteligentes" class="hash-link" aria-label="Link direto para Funções mais inteligentes." title="Link direto para Funções mais inteligentes." translate="no">​</a></h2>
<p>As funções <code>X_Display</code> mostradas acima podem receber dois parâmetros — entidade e estado de exibição, para permitir que todos os jogadores as vejam; ou, alternativamente, três parâmetros — entidade, jogador e estado de exibição. Há outras funções que também são inteligentes com seus parâmetros. Um conjunto de exemplos são as várias funções de rotação. Como mencionado na introdução, há pelo menos quatro maneiras diferentes de obter e definir rotações para diferentes entidades. Agora há uma só: <code>X_SetRotation</code> e <code>X_GetRotation</code>. Por exemplo:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Obtém apenas `z`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Player_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém os ângulos Euler x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Object_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém os ângulos quaternion w, x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Vehicle_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vehicleid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> w</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Qual é usado para qual entidade? Todos:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Obtém apenas `z`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Object_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém os ângulos Euler x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Object_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém os ângulos quaternion w, x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Object_GetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">objectid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> w</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Os significados dos parâmetros e do retorno são determinados pelo número de parâmetros fornecidos. O mesmo vale para Set:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Define apenas `z`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Vehicle_SetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vehicleid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Define os ângulos Euler x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Vehicle_SetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vehicleid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Define os ângulos quaternion w, x, y e z.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">Vehicle_SetRotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vehicleid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> w</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusão">Conclusão<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#conclus%C3%A3o" class="hash-link" aria-label="Link direto para Conclusão" title="Link direto para Conclusão" translate="no">​</a></h2>
<p>Tentamos muito criar uma API que seja fácil de usar, fácil de aprender, mas também compatível com versões anteriores. Muito do sucesso do SA<!-- -->:MP<!-- --> vem da sua facilidade de uso, e queremos manter isso, mas também sabemos que há usuários avançados que querem extrair muito mais do próprio código. Encontrar esse equilíbrio é sempre difícil, especialmente quando quem mais comenta são os mais experientes — aqueles que conhecem a linguagem por dentro e por fora e querem levá-la mais longe. Isso cria um sistema que se autosseleciona para recursos avançados em detrimento dos iniciantes. Não queremos isso, mas ainda assim queremos ouvir suas opiniões. Quais recursos de linguagem e API você gosta, e quais não gosta? Quais funções ajudariam você a tirar o máximo do seu código? Você acha o novo design simples ou complicado demais? Você está de boa com os nomes desorganizados das funções atuais? Eles cumprem seu propósito, então por que mudá-los? Como iniciante, você teria gostado que algo fosse feito de outra forma?</p>
<p>Por favor, compartilhe qualquer feedback que tiver no tópico do burgershot abaixo. Adoraríamos ouvir você:</p>
<p><a href="https://forum.open.mp/showthread.php?tid=1036" target="_blank" rel="noopener noreferrer" class="">https://forum.open.mp/showthread.php?tid=1036</a></p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#footnote-label" class="hash-link" aria-label="Link direto para Footnotes" title="Link direto para Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-31ff2b">
<p>Nota lateral interessante. Graças à forma como abstraímos o código da API de scripting, Dialog_IsValid é implementada como:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">SCRIPT_API</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Dialog_IsValid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">bool</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Dialog_s</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>É literalmente isso. Nenhuma implementação real é necessária porque, para a função ser chamada, a busca pela entidade deve ter sido bem-sucedida, e assim podemos retornar true instantaneamente. <a href="https://omp.itsneufox.com/pt-BR/blog/scripting-api#user-content-fnref-1-31ff2b" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Y_Less</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Testes no open.mp]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/debugging</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/debugging"/>
        <updated>2020-04-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Testar no SA:MP sempre foi desafiador, mas o open.mp introduz novas ferramentas para tornar isso mais fácil e eficiente. Com uma base de código open-source, ferramentas de depuração aprimoradas e uma nova e poderosa biblioteca de "mock" para simular interações de jogadores, os testes agora são mais automatizados e confiáveis do que nunca.]]></summary>
        <content type="html"><![CDATA[<p>Testar no SA<!-- -->:MP<!-- --> sempre foi desafiador, mas o open.mp introduz novas ferramentas para tornar isso mais fácil e eficiente. Com uma base de código open-source, ferramentas de depuração aprimoradas e uma nova e poderosa biblioteca de "mock" para simular interações de jogadores, os testes agora são mais automatizados e confiáveis do que nunca.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>aviso</div><div class="admonitionContent_BuS1"><p>O conteúdo do post a seguir está desatualizado e não reflete o estado atual do open.mp. O post está publicado aqui para fins de arquivamento.</p></div></div>
<p>Testar no SA<!-- -->:MP<!-- --> não é muito fácil. Na maior parte do tempo é só conectar ao servidor e colocar prints em todos os lugares. Bibliotecas como y_testing tornam a escrita de testes unitários muito mais fácil, mas apenas para código razoavelmente "puro" - isto é, código que roda no servidor sem muita interação de jogadores. Dá para testar uma quantidade surpreendente de comportamento assim, mas ainda é limitado e não ajuda a isolar problemas quando eles aparecem.</p>
<p>Então como o open.mp resolve isso? Bem, para começar, o código é open-source, então você tem à disposição toda a variedade de ferramentas de depuração existentes, como GDB e Visual Studio, para percorrer e inspecionar o código. Também temos planos de adicionar ferramentas parecidas para os próprios scripts pawn.</p>
<p>Mas a maior adição é a biblioteca "mock". De forma bem simples, ela permite criar jogadores falsos que agem exatamente como jogadores reais, mas sem nenhum cliente conectado. Assim, qualquer ação feita neles por um script pode ser lida e analisada por outro script. Vamos pegar o exemplo mais simples possível para uma primeira demonstração - mostrar um checkpoint a um jogador e confirmar que ele foi enviado. Com y_testing você faz a ação e depois precisa realmente perguntar ao jogador se aconteceu, o que é lento, não repetível e simplesmente tedioso:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">PTEST__ </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASK</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Do you see a checkpoint in the middle of the world?"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Usar uma biblioteca como "Pawn.RakNet" pode remover a pergunta, automatizando a verificação de pacotes enviados, mas ainda exige um jogador conectado, então não pode ser automatizado e repetido:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">static</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    gCheckpointPlayer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">gX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">gY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">gZ</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">gS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PTEST__ </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gX </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gY </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gZ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gS </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gCheckpointPlayer </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OPacket</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">107</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> BitStream</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    gCheckpointPlayer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> playerid</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">BS_IgnoreBits</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">BS_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> gX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">BS_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> gY</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">BS_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> gZ</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">BS_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> gS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Com o open.mp, temos uma API parecida com a do Pawn.RakNet, mas com jogadores falsos. Então você cria um jogador, sem uma instância do jogo, e o usa exatamente como um jogador normal:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">TEST__ </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Mock_CreatePlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Mr Mock"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Limpa todos os pacotes existentes para facilitar a busca.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Mock_PurgeSent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Mostra um checkpoint normalmente.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica se um pacote "SetCheckpoint" foi visto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new MockPacket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">packet </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Mock_GetPacket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SetCheckpoint"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica se o pacote tem 4 componentes, cada um com 32 bits.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_Components</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_Bits</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica os vários componentes.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">tmp</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Esse código é totalmente testável de forma repetível, autocontido (sem variáveis globais e callbacks extras) e simples de expandir.</p>
<p>Mas às vezes não é tão simples assim. Se você cria um objeto, não pode simplesmente verificar que ele foi enviado instantaneamente a um jogador, porque talvez ele não esteja perto o bastante e, portanto, o streamer embutido ainda não o enviou. Para resolver isso, primeiro precisamos fazer um pequeno desvio para explicar como a sincronização básica funciona para coisas como <code>SetPlayerPos</code>. Quando você define a posição de um jogador com <code>SetPlayerPos</code>, o servidor NÃO atualiza imediatamente a posição dele internamente e para todos os outros jogadores. Em vez disso, um comando <code>SET POSITION</code> é enviado para aquele jogador que está sendo movido, ele é teleportado para a nova posição e então informa a nova posição de volta ao servidor no próximo pacote de sincronização. O motivo é basicamente lag - pode haver um ou mais pacotes de sincronização ainda em trânsito com a posição antiga depois de definir a nova posição. Então o que isso significa para jogadores mock? Significa que você não pode realmente definir a posição deles, pelo menos não da forma normal. Não há cliente real, então não há nada recebendo pacotes (ou seja, o comando de definir posição), e não há nada sincronizando esses dados de volta para o servidor.</p>
<p>Podemos gerar qualquer dado de sincronização mock para o servidor a partir de jogadores mock, então essa é uma forma de atualizar a posição deles, mas pode ser um pouco trabalhoso para apenas uma operação comum; por isso existe <code>Mock_SetPlayerPos</code> exatamente para esse caso de uso. Mas isso ainda não é a história completa, porque precisamos que o streamer rode e atualize com a nova posição deles, o que acontece apenas periodicamente (a cada poucos milissegundos, dependendo da taxa de ticks do servidor). Para isso temos outra função mock - <code>Mock_Tick</code>, que avança o tempo do servidor em um determinado número de microssegundos (NÃO milissegundos). Isso absolutamente não deve ser usado em servidores ao vivo, pois pode criar todo tipo de comportamento estranho com timers e outros códigos sensíveis ao tempo, mas pode ser usado para simular a passagem do tempo em testes. Observe que <code>Mock_Tick(10000)</code> não vai aguardar 10ms; em vez disso, vai avançar o tempo em 10 milissegundos instantaneamente.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">TEST__ </span><span class="token function" style="color:#d73a49">SetPlayerCheckpoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Mock_CreatePlayer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Mr Mock"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Limpa todos os pacotes existentes para facilitar a busca.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Mock_PurgeSent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Cria um objeto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">CreateObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1337</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Simula a atualização da posição do jogador mock para o servidor, perto do objeto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Mock_SetPlayerPos</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">105.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">105.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Agora SIMULA a passagem de algum tempo, para que o streamer possa rodar (50ms deve bastar).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Mock_Tick</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica se um pacote "CreateObject" foi visto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new MockPacket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">packet </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Mock_GetPacket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">playerid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CreateObject"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica se o pacote tem 4 componentes, cada um com 32 bits.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_Components</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Verifica alguns dos componentes do pacote.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new </span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    new Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">tmp</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadInt32</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1337</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">MockPacket_ReadFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">packet</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tmp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ASSERT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tmp </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Uma observação importante sobre <code>Mock_Tick</code>. Se você chamá-lo como, digamos, <code>Mock_Tick(100000)</code> e tiver um timer de 1ms rodando, isso acionará instantaneamente o timer, mas o timer pensará que perdeu seu tempo por uma grande margem (100ms) e se enfileirará novamente. Durante a chamada a <code>Mock_Tick</code>, o timer será disparado uma vez, mas depois que o teste atual terminar o timer será enfileirado mais 99 vezes, uma por tick, porque ele acha que perdeu 100 invocações.</p>
<p>Mais tarde abordaremos algumas técnicas de depuração de nível mais alto para que você possa ler e escrever pacotes falsos com mais facilidade, em vez de um componente por vez como nesse código, mas isso apresenta o básico sobre o qual todo o resto é construído. Esperamos que isso torne o desenvolvimento e os testes de código mais fáceis para todos (e também garanta que o servidor seja mais estável).</p>
<p>Também vamos falar muito mais sobre o design da API do open.mp amanhã. Ela é totalmente compatível com versões anteriores do SA<!-- -->:MP<!-- -->, mas isso não significa que não haja espaço paralelo para melhorias.</p>]]></content>
        <author>
            <name>Y_Less</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Sincronização de Veículos]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/vehicle-sync</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/vehicle-sync"/>
        <updated>2019-11-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Um post rápido demonstrando a evolução da sincronização de veículos.]]></summary>
        <content type="html"><![CDATA[<p>Um post rápido demonstrando a evolução da sincronização de veículos.</p>
<video autoplay="" loop="" width="100%" controls=""><source src="/pt-BR/assets/medias/vehicle_sync_01-115525d42cb827b58443f71baedf9b42.mp4" type="video/mp4"></video>
<video autoplay="" loop="" width="100%" controls=""><source src="/pt-BR/assets/medias/vehicle_sync_02-fe8141022639554363f8904dd1756227.mp4" type="video/mp4"></video>
<video autoplay="" loop="" width="100%" controls=""><source src="/pt-BR/assets/medias/vehicle_sync_03-34a6a71412eb7a6c7c9413023445bb04.mp4" type="video/mp4"></video>]]></content>
        <author>
            <name>Southclaws</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Módulo de Turfs (anteriormente gangzones)]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/turfs-formerly-gangzones-module</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/turfs-formerly-gangzones-module"/>
        <updated>2019-10-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Olá! Acabei de terminar nossa implementação de Turf no servidor e pensei em publicar uma visão geral deste módulo e mostrar que não desistimos nem nada do tipo!]]></summary>
        <content type="html"><![CDATA[<p>Olá! Acabei de terminar nossa implementação de Turf no servidor e pensei em publicar uma visão geral deste módulo e mostrar que não desistimos nem nada do tipo!</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>aviso</div><div class="admonitionContent_BuS1"><p>O conteúdo da publicação abaixo está desatualizado e não reflete o estado atual do open.mp. A publicação está disponível aqui para fins de arquivamento.</p></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Cria um Turf. Um playerid pode ser passado para torná-lo um turf de jogador.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Turf_Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">minx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">miny</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">maxx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Float</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">maxy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">owner </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> INVALID_PLAYER_ID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Destrói um turf.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Turf_Destroy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">turf</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Mostra um Turf para um jogador ou jogadores.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Turf_Show</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">turf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> colour</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> INVALID_PLAYER_ID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Oculta um Turf de um jogador ou jogadores.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Turf_Hide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">turf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> INVALID_PLAYER_ID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Faz um Turf piscar para um jogador ou jogadores.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Turf_Flash</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">turf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> colour</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> INVALID_PLAYER_ID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Para o piscar de um Turf para jogador(es).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Turf_StopFlashing</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Turf</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">turf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Player</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">playerid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> INVALID_PLAYER_ID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Isso é obviamente diferente da API tradicional, mas não se preocupe: haverá wrappers para esse tipo de coisa, garantindo que um script normal possa ser recompilado sem problemas e sem edições.</p>
<p>Outro fato importante que talvez você queira saber é que todos os turfs ficam no mesmo pool, e há um máximo de 4.294.967.295 turfs que podem ser criados pelo script. No entanto, o cliente só consegue lidar com 1024 turfs ao mesmo tempo.</p>]]></content>
        <author>
            <name>J0sh</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Módulo de timers]]></title>
        <id>https://omp.itsneufox.com/pt-BR/blog/timers</id>
        <link href="https://omp.itsneufox.com/pt-BR/blog/timers"/>
        <updated>2019-05-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Esta prévia mostra melhorias no módulo de timers no open.mp, introduzindo uma API mais flexível e eficiente, mantendo a compatibilidade retroativa.]]></summary>
        <content type="html"><![CDATA[<p>Esta prévia mostra melhorias no módulo de timers no open.mp, introduzindo uma API mais flexível e eficiente, mantendo a compatibilidade retroativa.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>aviso</div><div class="admonitionContent_BuS1"><p>O conteúdo da publicação abaixo está desatualizado e não reflete o estado atual do open.mp. A publicação está disponível aqui para fins de arquivamento.</p></div></div>
<p>Esta é uma prévia de um dos módulos melhorados que fizemos, para timers no open.mp:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">SetTimer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> func</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msInterval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bool</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">repeat</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> SetTimerEx</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">SetTimerEx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> func</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msInterval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bool</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">repeat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GLOBAL_TAG_TYPES</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">KillTimer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Timer_Kill</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// CreateTimer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Timer_Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> func</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> usDelay</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> usInterval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> repeatCount</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GLOBAL_TAG_TYPES</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// KillTimer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Timer_Kill</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Retorna o tempo até a próxima chamada.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Timer_GetTimeRemaining</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém o número de chamadas restantes a fazer (0 para ilimitado).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Timer_GetCallsRemaining</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém o parâmetro `repeatCount`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Timer_GetTotalCalls</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Obtém o parâmetro `usInterval`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native </span><span class="token function" style="color:#d73a49">Timer_GetInterval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Redefine o tempo restante até a próxima chamada para `usInterval`.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">native bool</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Timer_Restart</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">timer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Os dois primeiros existem apenas para compatibilidade retroativa; o restante é a API melhorada:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">native Timer</span><span class="token operator" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">Timer_Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> func</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> usDelay</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> usInterval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> repeatCount</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GLOBAL_TAG_TYPES</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>func</code> - Bem óbvio: o que chamar.</li>
<li class=""><code>usDelay</code> - Também óbvio: o atraso antes da chamada (em microssegundos).</li>
<li class=""><code>usInterval</code> - Para qual valor redefinir <code>usDelay</code> depois da primeira chamada. Então, se você quisesse um timer a cada hora cheia, mas agora fossem 8:47 da manhã, a chamada seria <code>Timer_Create("OnTheHour", 780 SECONDS, 3600 SECONDS, 0);</code></li>
<li class=""><code>repeatCount</code> - Diferente das funções antigas, que eram apenas "uma vez" ou "para sempre", isto recebe o número de vezes que a função deve ser chamada. "Uma vez" seria <code>1</code>, <code>500</code> pararia após 500 chamadas e (ao contrário da API antiga) <code>0</code> significa "para sempre".</li>
<li class=""><code>GLOBAL_TAG_TYPES</code> - Como <code>{Float, ...}</code>, mas com mais tags.</li>
</ul>]]></content>
        <author>
            <name>Y_Less</name>
        </author>
    </entry>
</feed>