{"id":63,"date":"2025-08-14T16:32:11","date_gmt":"2025-08-14T16:32:11","guid":{"rendered":"https:\/\/ayoocloud.com.br\/blog\/?p=63"},"modified":"2025-08-14T21:11:27","modified_gmt":"2025-08-14T21:11:27","slug":"como-criar-plugins-para-samp-facilmente-com-a-biblioteca-samp-ptl-c17","status":"publish","type":"post","link":"https:\/\/ayoocloud.com.br\/blog\/2025\/08\/14\/como-criar-plugins-para-samp-facilmente-com-a-biblioteca-samp-ptl-c17\/","title":{"rendered":"Como Criar Plugins para SA:MP Facilmente com a Biblioteca samp-ptl (C++17)"},"content":{"rendered":"<p>Se voc\u00ea desenvolve para <strong data-start=\"370\" data-end=\"405\">SA:MP (San Andreas Multiplayer)<\/strong> e j\u00e1 pensou em criar <strong data-start=\"427\" data-end=\"452\">seus pr\u00f3prios plugins<\/strong>, sabe que a tarefa pode ser complexa.<br data-start=\"490\" data-end=\"493\" \/>Mas com a <strong data-start=\"503\" data-end=\"537\">biblioteca de modelos samp-ptl<\/strong>, o processo fica muito mais simples e seguro, permitindo que voc\u00ea crie funcionalidades poderosas para o seu servidor sem dor de cabe\u00e7a.<\/p>\n<hr \/>\n<h2 data-start=\"680\" data-end=\"706\"><strong data-start=\"683\" data-end=\"706\">O que \u00e9 a samp-ptl?<\/strong><\/h2>\n<p data-start=\"708\" data-end=\"1021\">A <strong data-start=\"710\" data-end=\"722\">samp-ptl<\/strong> \u00e9 uma biblioteca escrita em <strong data-start=\"751\" data-end=\"760\">C++17<\/strong> que fornece uma base pronta para desenvolvimento de plugins SA:MP.<br data-start=\"827\" data-end=\"830\" \/>Com ela, voc\u00ea n\u00e3o precisa se preocupar com a integra\u00e7\u00e3o manual entre C++ e o sistema AMX do SA:MP \u2014 a biblioteca j\u00e1 traz <strong data-start=\"951\" data-end=\"1020\">fun\u00e7\u00f5es utilit\u00e1rias, tratamento de erros e convers\u00f5es autom\u00e1ticas<\/strong>.<\/p>\n<hr data-start=\"1023\" data-end=\"1026\" \/>\n<h2 data-start=\"1028\" data-end=\"1054\"><strong data-start=\"1031\" data-end=\"1054\">Principais Recursos<\/strong><\/h2>\n<ul data-start=\"1056\" data-end=\"1751\">\n<li data-start=\"1056\" data-end=\"1146\">\n<p data-start=\"1058\" data-end=\"1146\">\u2705 <strong data-start=\"1060\" data-end=\"1082\">API C++ AMX segura<\/strong> \u2013 tratamento de erros integrado, evitando crashs no servidor.<\/p>\n<\/li>\n<li data-start=\"1147\" data-end=\"1223\">\n<p data-start=\"1149\" data-end=\"1223\">\ud83d\udcdc <strong data-start=\"1152\" data-end=\"1175\">Conjunto de scripts<\/strong> \u2013 modo de jogo de exemplo pronto para testes.<\/p>\n<\/li>\n<li data-start=\"1224\" data-end=\"1332\">\n<p data-start=\"1226\" data-end=\"1332\">\u26a1 <strong data-start=\"1228\" data-end=\"1248\">Callbacks f\u00e1ceis<\/strong> \u2013 execu\u00e7\u00e3o simples de fun\u00e7\u00f5es p\u00fablicas com cache opcional para melhor desempenho.<\/p>\n<\/li>\n<li data-start=\"1333\" data-end=\"1493\">\n<p data-start=\"1335\" data-end=\"1493\">\ud83d\udd04 <strong data-start=\"1338\" data-end=\"1374\">Cadastro de nativos simplificado<\/strong> \u2013 par\u00e2metros do tipo <code data-start=\"1396\" data-end=\"1402\">cell<\/code> convertidos automaticamente para tipos C++ comuns (<code data-start=\"1454\" data-end=\"1459\">int<\/code>, <code data-start=\"1461\" data-end=\"1468\">float<\/code>, <code data-start=\"1470\" data-end=\"1483\">std::string<\/code>, etc.).<\/p>\n<\/li>\n<li data-start=\"1494\" data-end=\"1591\">\n<p data-start=\"1496\" data-end=\"1591\">\ud83d\udee0 <strong data-start=\"1499\" data-end=\"1541\">Defini\u00e7\u00e3o de convers\u00f5es personalizadas<\/strong> \u2013 crie regras de convers\u00e3o para tipos pr\u00f3prios.<\/p>\n<\/li>\n<li data-start=\"1592\" data-end=\"1689\">\n<p data-start=\"1594\" data-end=\"1689\">\ud83d\udd0d <strong data-start=\"1597\" data-end=\"1622\">Verifica\u00e7\u00e3o de vers\u00e3o<\/strong> \u2013 o plugin verifica se est\u00e1 usando a vers\u00e3o correta dos scripts.<\/p>\n<\/li>\n<li data-start=\"1690\" data-end=\"1751\">\n<p data-start=\"1692\" data-end=\"1751\">\ud83d\udcda <strong data-start=\"1695\" data-end=\"1715\">Exemplos prontos<\/strong> \u2013 ajuda voc\u00ea a come\u00e7ar rapidamente.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"1753\" data-end=\"1756\" \/>\n<h2 data-start=\"1758\" data-end=\"1787\"><strong data-start=\"1761\" data-end=\"1787\">Como Usar a Biblioteca<\/strong><\/h2>\n<h3 data-start=\"1789\" data-end=\"1814\"><strong data-start=\"1793\" data-end=\"1814\">1. Pr\u00e9-requisitos<\/strong><\/h3>\n<p data-start=\"1815\" data-end=\"1854\">Antes de come\u00e7ar, voc\u00ea vai precisar de:<\/p>\n<ul data-start=\"1855\" data-end=\"2043\">\n<li data-start=\"1855\" data-end=\"1923\">\n<p data-start=\"1857\" data-end=\"1923\"><strong data-start=\"1857\" data-end=\"1892\">Compilador compat\u00edvel com C++17<\/strong> (GCC 7+, Clang 5+, MSVC 2017+)<\/p>\n<\/li>\n<li data-start=\"1924\" data-end=\"1959\">\n<p data-start=\"1926\" data-end=\"1959\"><strong data-start=\"1926\" data-end=\"1935\">CMake<\/strong> para compilar o projeto<\/p>\n<\/li>\n<li data-start=\"1960\" data-end=\"2010\">\n<p data-start=\"1962\" data-end=\"2010\"><strong data-start=\"1962\" data-end=\"1978\">SDK do SA:MP<\/strong> para desenvolvimento de plugins<\/p>\n<\/li>\n<li data-start=\"2011\" data-end=\"2043\">\n<p data-start=\"2013\" data-end=\"2043\">Conhecimento b\u00e1sico de <strong data-start=\"2036\" data-end=\"2043\">C++<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\ud83d\udca1 <em data-start=\"2142\" data-end=\"2149\">Dica:<\/em> Voc\u00ea pode usar um <a href=\"https:\/\/ayoocloud.com.br\"><strong data-start=\"2168\" data-end=\"2194\">servidor virtual (VPS)<\/strong><\/a> para hospedar o SA:MP e testar seus plugins sem depender do seu PC.<br data-start=\"2262\" data-end=\"2265\" \/>Se precisar de uma m\u00e1quina para desenvolvimento ou hospedagem, confira nossos planos em <strong data-start=\"2353\" data-end=\"2401\"><a class=\"cursor-pointer\" href=\"https:\/\/ayoocloud.com.br\" target=\"_new\" rel=\"noopener\" data-start=\"2355\" data-end=\"2399\">AyooCloud.com.br<\/a><\/strong> \u2014 com \u00f3timo desempenho e suporte para desenvolvedores de jogos.<\/p>\n<hr data-start=\"2045\" data-end=\"2048\" \/>\n<h3 data-start=\"2050\" data-end=\"2103\"><strong data-start=\"2054\" data-end=\"2103\">2. Estrutura B\u00e1sica de um Plugin com samp-ptl<\/strong><\/h3>\n<p data-start=\"2104\" data-end=\"2198\">A biblioteca fornece um modelo b\u00e1sico para voc\u00ea come\u00e7ar.<br data-start=\"2160\" data-end=\"2163\" \/>Um plugin m\u00ednimo poderia ser assim:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;ptl\/ptl.hpp&gt;\r\n\r\nPLUGIN_EXPORT bool PLUGIN_CALL OnGameModeInit()\r\n{\r\nptl::log(\"Plugin iniciado com sucesso!\");\r\nreturn true;\r\n}\r\n\r\nPTL_PLUGIN()<\/pre>\n<p>Esse exemplo cria um plugin que simplesmente mostra uma mensagem no console do servidor quando o modo de jogo inicia.<\/p>\n<hr \/>\n<h3 data-start=\"2489\" data-end=\"2521\"><strong data-start=\"2493\" data-end=\"2521\">3. Registrando um Nativo<\/strong><\/h3>\n<p data-start=\"2522\" data-end=\"2611\">Se voc\u00ea quiser criar uma fun\u00e7\u00e3o que possa ser chamada no seu <strong data-start=\"2583\" data-end=\"2591\">.pwn<\/strong>, basta registr\u00e1-la:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;ptl\/ptl.hpp&gt;\r\n\r\nint GetServerVersion(AMX* amx, cell* params)\r\n{\r\nreturn 1; \/\/ Vers\u00e3o fict\u00edcia\r\n}\r\n\r\nPTL_BEGIN()\r\nPTL_NATIVE(\"GetServerVersion\", GetServerVersion)\r\nPTL_END()<\/pre>\n<p data-start=\"2807\" data-end=\"2851\">No seu script <strong data-start=\"2821\" data-end=\"2829\">.pwn<\/strong>, voc\u00ea poderia chamar:<\/p>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">new version = GetServerVersion();\r\nprintf(\"Vers\u00e3o do plugin: %d\", version);<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div dir=\"ltr\">\n<hr \/>\n<\/div>\n<\/div>\n<div dir=\"ltr\">\n<h3 data-start=\"2945\" data-end=\"2986\"><strong data-start=\"2949\" data-end=\"2986\">4. Chamando Callbacks do Servidor<\/strong><\/h3>\n<p data-start=\"2987\" data-end=\"3062\">Com a samp-ptl, voc\u00ea pode disparar eventos como se fossem do pr\u00f3prio SA:MP:<\/p>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ptl::callback::call(\"OnPlayerConnect\", playerid);<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div dir=\"ltr\">\n<hr \/>\n<h2 data-start=\"3131\" data-end=\"3166\"><strong data-start=\"3134\" data-end=\"3166\">Vantagens de Usar a samp-ptl<\/strong><\/h2>\n<ul data-start=\"3167\" data-end=\"3424\">\n<li data-start=\"3167\" data-end=\"3263\">\n<p data-start=\"3169\" data-end=\"3263\">\ud83d\ude80 <strong data-start=\"3172\" data-end=\"3189\">Produtividade<\/strong>: c\u00f3digo pronto para usar, menos tempo configurando, mais tempo criando.<\/p>\n<\/li>\n<li data-start=\"3264\" data-end=\"3354\">\n<p data-start=\"3266\" data-end=\"3354\">\ud83d\udee1 <strong data-start=\"3269\" data-end=\"3282\">Seguran\u00e7a<\/strong>: tratamento de erros evita que um plugin bugado derrube seu servidor.<\/p>\n<\/li>\n<li data-start=\"3355\" data-end=\"3424\">\n<p data-start=\"3357\" data-end=\"3424\">\ud83c\udfaf <strong data-start=\"3360\" data-end=\"3377\">Flexibilidade<\/strong>: desde fun\u00e7\u00f5es simples at\u00e9 sistemas completos.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<\/div>\n<h2>Onde Encontrar e Baixar<\/h2>\n<p><a href=\"https:\/\/github.com\/urShadow\/samp-ptl\/tree\/master\/example\">samp-ptl-tree-master-example<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/urShadow\/Pawn.CMD\">Pawn.CMD<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/urShadow\/Pawn.Regex\">Pawn.Regex<\/a><\/p>\n<p><b><span dir=\"auto\">C\u00f3digo-fonte:<\/span><\/b><\/p>\n<p><a href=\"https:\/\/github.com\/urShadow\/samp-ptl\">Samp-ptl<\/a><\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea desenvolve para SA:MP (San Andreas Multiplayer) e j\u00e1 pensou em criar seus pr\u00f3prios plugins, sabe que a tarefa pode ser complexa.Mas com a biblioteca de modelos samp-ptl, o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56,57,29],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-gta-samp","category-samp","category-servidor-dedicado"],"_links":{"self":[{"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/posts\/63","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/comments?post=63"}],"version-history":[{"count":2,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/posts\/63\/revisions"}],"predecessor-version":[{"id":76,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/posts\/63\/revisions\/76"}],"wp:attachment":[{"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/media?parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/categories?post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ayoocloud.com.br\/blog\/wp-json\/wp\/v2\/tags?post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}