[Duvida] Como criar um plug in ?

Ir em baixo

[Duvida] Como criar um plug in ?

Mensagem por Juniior3 em Sab Set 07, 2013 2:02 am

Ultimamente tenho me dedicado a estudar C/C++ com alguns vídeos e leituras. Como já tenho algum conhecimento em Pawn e percebi que tenho potencial (desculpe parecer arrogante, mas eu acho que consigo fazer coisas que vão ser úteis e ajudar os outros) decidi me expandir para outras áreas, mas eu não consigo me desprender do SAMP, que foi onde eu comecei a ter interesse por programação. Por esse motivo me surgiu o interesse de fazer plugins que sejam úteis no SAMP, mesmo que alguém use sem meus créditos, eu quero fazer como uma satisfação pessoal.

Todo esse texto para chegar a uma única pergunta: Como fazer um plugin para SAMP? É necessário alguma biblioteca extra ou algo do gênero? Obrigado!

Juniior3
Novato
Novato

Mensagens : 6
Data de inscrição : 15/08/2013

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Willian Luigi em Sab Set 07, 2013 2:32 am

#Tópico movido para a área correta.

Bom, eu te entendo, mas eu sempre tive interesse por conhecer todo tipo de linguagem que me agradasse.(um pouco diferente) Já não me considero mais dessa área de Pawn(SA-MP).

Respondendo as suas perguntas...

Você irá precisar de um SDK que contém umas bibliotecas do próprio PAWN em relação a AMX e outra de plug-ins.

Download link: Plug-in SDK (uploaded by Willian Luigi)
Pode baixar sem medo, não tem nenhum arquivo malicioso/executável, são apenas os códigos fontes do SDK, tu precisa inserir eles no teu projeto, sempre que tu for fazer um plug-in novo...

Como iniciar(Visando a utilização da IDE Visual Studio 2010):

Você deverá criar um projeto novo, pode inicia-lo 100% vazio ou então do jeito que vier mesmo. Este projeto deverá ser do tipo .dll(Dinamyc Library Link)

Após ter a solução do projeto toda pronta para desenvolvimento, você cria um arquivo novo dentro da solução, com a extensão ".def" este arquivo irá ser responsável por inserir algumas funções do SDK, dentro dele você inseri o seguinte código:
Código:
EXPORTS
 Supports
 Load
 Unload
 AmxLoad
 AmxUnload
Salve ele, vá nas propriedades do seu projeto.
Projeto->properties->configuration properties->linker->input.

Na linha Module Definition File você põe o nome do arquivo .def que você criou, "exemplo.def"

Após ter todos estes primeiros passos prontos, tu pode começar o .cpp do plug-in, a intenção é que você tenha ao menos um conhecimento razoável de C++, pois caso contrário, acaba sendo complicado você conseguir fazer coisas realmente produtivas.

Exemplo de código:
plugin.cpp
Código:
/*
|
| Includes da SDK & que você pretender usar para beneficiar seu Plug-in
|
*/

typedef void (*logprintf_t)(char* format, ...);

logprintf_t logprintf;
extern void *pAMXFunctions;

cell AMX_NATIVE_CALL _strlen(AMX* amx, cell* params)
{
 cell* addr = NULL;
 int len = NULL;
 amx_GetAddr(amx, params[1], &addr);
 amx_StrLen(addr, &len);

 return len;
}

cell AMX_NATIVE_CALL _strcpy(AMX* amx, cell* params)
{
 cell* addr[2] = {NULL, NULL};
 char* stringReceive = NULL;

 amx_GetAddr(amx, params[1], &addr[0]);
 amx_GetAddr(amx, params[2], &addr[1]);
 stringReceive = new char[params[3]];
 amx_GetString(stringReceive, addr[1], 0, params[3]);
 amx_SetString(addr[0], stringReceive, 0, 0, params[3]);

 return ((stringReceive)?(delete[] stringReceive, 0):(delete[] stringReceive, -1));
}

cell AMX_NATIVE_CALL strcpyy(AMX* amx, cell* params)
{
 cell* addr[2] = {NULL, NULL};
 char* strrd = new char[params[3]];
 char* strrc = new char[params[3]];
 
amx_GetAddr(amx, params[1], &addr[0]);
 amx_GetAddr(amx, params[2], &addr[1]);
 amx_GetString(strrd, addr[0], 0, params[3]);
 amx_GetString(strrc, addr[1], 0, params[3]);
 for (int i = 0; i < sizeof(strrd); i++)
 {
 strrd[i] = strrc[i];
 }
 *addr[0] = *strrd;
delete[] strrc;
 delete[] strrd;
 return 1;
}

cell AMX_NATIVE_CALL _strcmp(AMX* amx, cell* params)
{
 cell* addr[2] = {NULL, NULL};
 char *str1, *str2;
 int len[] = {NULL, NULL};

 amx_GetAddr(amx, params[1], &addr[0]);
 amx_GetAddr(amx, params[2], &addr[1]);
 amx_StrLen(addr[0], &len[0]);
 amx_StrLen(addr[1], &len[1]);
 str1 = new char[len[0]];
 str2 = new char[len[1]];
 amx_GetString(str1, addr[0], NULL, len[0]);
 amx_GetString(str2, addr[1], NULL, len[1]);

 return ((strcmp(str1, str2) == 0)?(delete[] str1, delete[] str2, 0):(delete[] str1, delete[] str2, -1));
}

PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
{
 return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES | SUPPORTS_PROCESS_TICK;
}

PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
 g_Invoke = new Invoke;
    pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
    logprintf = (logprintf_t) ppData[PLUGIN_DATA_LOGPRINTF];

 logprintf("\n==============================\n");
 logprintf(" * StrJobs loaded.\n");
 logprintf(" (c) - 2011 Willian Luigi");
 logprintf("\n==============================\n");
 return true;
}

PLUGIN_EXPORT void PLUGIN_CALL Unload()
{
    logprintf("\n==============================\n");
 logprintf(" * StrJobs loaded.\n");
 logprintf(" (c) - 2011 Willian Luigi");
 logprintf("\n==============================\n");
}

AMX_NATIVE_INFO PluginNatives[] =
{
 {"_strlen", _strlen},
 {"_strcpy", _strcpy},
 {"strcpyy", strcpyy},
 {"_strcmp", _strcmp},
    {0, 0}
};

PLUGIN_EXPORT int PLUGIN_CALL AmxLoad( AMX *amx )
{
 return amx_Register(amx, PluginNatives, -1);
}


PLUGIN_EXPORT int PLUGIN_CALL AmxUnload( AMX *amx )
{
    return AMX_ERR_NONE;
}
Você vai ver mais a frente no link que vou postar, que você precisa indicar
AMX_NATIVE_CALL toda vez que for inserir um método novo para o seu plug-in, e além disso você precisa documentar este método na matriz de funções "PluginNatives"
para que estes métodos possam ser realmente exportados para o sa-mp, quando você inserir sua .dll na pasta plug-ins...

Eu te deixei alguns exemplos simples de funções que utilizam apenas um conhecimento base de C++, se você não tiver entendendo direito isto indica que você vai precisar estudar um pouco para poder iniciar os plugins...

Tem um link no fórum sa-mp muito bom, que ensina completo a respeito de plug-ins, todas as funções que o SDK do AMX provê, e coisas do tipo, o ruim é que é em inglês, mas vai ser muito útil mesmo assim...

Tutorial: Plugin development guide

Espero ter ajudado ao menos a te mostrar o caminho, qualquer dúvida você pode postar aqui neste tópico mesmo que eu volto a responder.

Abraços...

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Juniior3 em Sab Set 07, 2013 3:21 am

Entendi, mas você disse que eu tenho que fazer o projeto em uma .dll, mas pra converter pro linux basta "mudar a extensão" ou tem que refazer o plugin pra linux ?

Juniior3
Novato
Novato

Mensagens : 6
Data de inscrição : 15/08/2013

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Willian Luigi em Sab Set 07, 2013 3:27 am

Então, nesse caso te recomendo usar o compilador g++, você tem que compilar ele duas vezes pra ficar "multiplataforma" uma vez com o VS, para ficar .dll, e outra com o g++, para obter o .so, não creio que precise refazer o plugin para isso... Smile

Desculpe não ter uma resposta precisa pra te dar, é que eu particularmente só trabalho com Windows.

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Juniior3 em Sab Set 07, 2013 4:00 am

Eu também trabalho com Windows, mas muitas hosts trabalham com Linux por ser de graça e não dar despesa enfim.. Obrigado ! Ajudou muito !

Juniior3
Novato
Novato

Mensagens : 6
Data de inscrição : 15/08/2013

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por AlieN_ em Seg Set 09, 2013 1:29 am

grande william,manja demais desses codigos diabólicos -q -q -q <3

_________________
avatar
AlieN_
Mr. M
Mr. M

Mensagens : 78
Data de inscrição : 23/07/2013
Idade : 23
Localização : SpirowlanD

Ver perfil do usuário http://www.redtube.com

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Willian Luigi em Seg Set 09, 2013 3:32 pm

AlieN_ escreveu:grande william,manja demais desses codigos diabólicos -q -q -q <3
hehe, valeu Very Happy

_________________
<br>
avatar
Willian Luigi
Fundador
Fundador

Mensagens : 63
Data de inscrição : 22/07/2013
Idade : 23
Localização : CODE.ME company

Ver perfil do usuário http://codeme.forumeiros.com

Voltar ao Topo Ir em baixo

Re: [Duvida] Como criar um plug in ?

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum