08.10.2013, 20:20
(
Последний раз редактировалось WLSF; 16.11.2014 в 01:09.
)
Boas, para quem nгo viu ainda, eu havia criado um tуpico de uma include que fazia hook em callbacks nativas(apenas),
que na maioria dos casos й oque mais acontece, o povo sempre faz hook em nativas...
[Include] HOOK(testes)
Me perguntaram se tinha possibilidade de hookear funзхes que nгo fossem nativas,
e isso fugia da utilidade da minha include, que era simples.
Por isso eu criei esse simples cуdigo para dar inicio a uma forma diferente de se fazer hook, e bem diferente...
Nгo estarei fazendo a introduзгo ao cуdigo, para quem quiser saber mais pode tirar dъvidas comigo.
Exemplos de uso,
exemplos com nativas/funзхes
caso 1:
Eu nгo estarei trabalhando com 3 callbacks diferentes, serгo apenas duas, sendo ambas nativas o processamento delas ficarб separado pelo 'call', que chamarб a callback do GM.
caso 2:
Nesse exemplo serб chamado apenas a callback da include primeiramente e a callback do GM "function::", a callback declarada normalmente serб descartada do script em questхes de funcionamento, mas caso vocк exclua ou comente as funзхes de hook, a callback normal volta a funcionar, em todos os casos isto nгo gera erros.
caso 3:
Aqui vocк irб usar 'hook_f' para indicar que vocк irб hookear uma funзгo, como a funзгo nгo й nativa, vocк precisa do 'forward', isso vocкs jб sabem..
Exemplos com stocks
caso 4:
Aqui vocк irб usar 'hook_s' para indicar que vocк hookear uma stock.
Exemplos de casos errados,
caso 1:
Isto irб gerar erros, pois vocк nгo estб utilizando a callback 'function::' que serve para chamar a funзгo nativa que funcionarб em "paralelo" com a funзгo da include.
caso 2:
Isto nгo irб funcionar, pois vocк nгo estб utilizando o 'call' para fazer a chamada para a funзгo do "function::".
OBS: isto й algo que pode ser melhorado futuramente, deixando de lado o 'call'.
o caso de uso correto teria de usar o
caso 3:
Isto poderб gerar stack overflows apуs um loop infinito de chamadas, pois o 'call' sу chama a funзгo do gm 'function::', se vocк utilizar o call dentro dela para chamar a ela mesmo, isto se tornarб um loop atй que a sua memуria bufunfe, o correto й utilizar o call somente na chamada 'hook_f::'
Exemplo de script.inc:
Exemplo de script.pwn:
Download whooks.inc
Atй entгo й isso, o cуdigo da include estб simples, mas estб bem diferenciado,
eu criei este tуpico separado para ele pois й do meu interesse ir atualizando
e se possнvel aumentar o caso de uso dele, assim aumentando tambйm a funcionalidade.
Faзam seus testes, e podem comentar se o interesse for:
tirar dъvidas,
reportar possнveis bugs,
ideias adicionais,
postar exemplos de cуdigos utilizando a include,
pedir autуgrafos,
elogiar.
que na maioria dos casos й oque mais acontece, o povo sempre faz hook em nativas...
[Include] HOOK(testes)
Me perguntaram se tinha possibilidade de hookear funзхes que nгo fossem nativas,
e isso fugia da utilidade da minha include, que era simples.
Por isso eu criei esse simples cуdigo para dar inicio a uma forma diferente de se fazer hook, e bem diferente...
Nгo estarei fazendo a introduзгo ao cуdigo, para quem quiser saber mais pode tirar dъvidas comigo.
Код:
hook_f - Faz o hook de uma funзгo/nativa hook_s - Faz o hook de uma stock function - Faz a segunda chamada de uma funзгo/nativa hookeada stock - Faz a segunda chamada de uma stock hookeada call - Chama a funзгo do gamemode, apуs ter executado a include
exemplos com nativas/funзхes
caso 1:
pawn Код:
//hook:: й oque vocк vai usar na sua include.
hook_f::OnGameModeInit()
{
print("hooked function");
call->OnGameModeInit();
return nop;
}
//Aqui vocк irб usar no seu gamemode.
function::OnGameModeInit()
{
print("native function");
return 1;
}
caso 2:
pawn Код:
//Include
hook_f::OnGameModeInit()
{
print("hooked function");
call->OnGameModeInit();
return nop;
}
//GM
function::OnGameModeInit()
{
print("native function");
return 1;
}
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
print("[DEBUG / GM] Callback: OnGameModeInit called");
return 1;
}
caso 3:
pawn Код:
//include
hook_f::Teste()
{
print("hooked");
call->Teste();
}
//GM
forward Teste();
function::Teste()
{
print("none");
}
Exemplos com stocks
caso 4:
pawn Код:
//Include
hook_s::Teste()
{
print("hooked");
call->Teste();
}
//GM
stock::Teste()
{
print("none");
}
//[GM] Uso:
main()
{
Teste();
}
Exemplos de casos errados,
caso 1:
pawn Код:
//Include
hook_f::OnGameModeInit()
{
print("hooked function");
call->OnGameModeInit();
return nop;
}
//GM
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
print("[DEBUG / GM] Callback: OnGameModeInit called");
return 1;
}
caso 2:
pawn Код:
//Include
hook_f::OnGameModeInit()
{
print("hooked function");
return nop;
}
//GM
function::OnGameModeInit()
{
print("native function");
return 1;
}
OBS: isto й algo que pode ser melhorado futuramente, deixando de lado o 'call'.
o caso de uso correto teria de usar o
pawn Код:
call->OnGameModeInit();
pawn Код:
//Include
hook_f::OnGameModeInit()
{
print("hooked function");
return nop;
}
//GM
function::OnGameModeInit()
{
print("native function");
call->OnGameModeInit();
return 1;
}
Exemplo de script.inc:
pawn Код:
hook_f::OnGameModeInit()
{
//Cуdigos para o hook da include.
print("Estб funзгo estб hookeada");
//Chamada para funзгo/nativa do GameMode
call->OnGameModeInit();
return 1;
}
hook_f::OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp(cmdtext, "/teste") == 0)
{
SendClientMessage(playerid, -1, "Vocк usou um comando :D");
print("comando da funзгo hookeada utilizado.");
}
call->OnPlayerCommandText(playerid, cmdtext);
return nop; //NOP, seria o valor que indicaria 'No Operation', pois o ъnico valor de retorno que importa, й o da funзгo do gamemode..
}
pawn Код:
#include <a_samp>
#include <whook>
main(){}
function::OnGameModeInit()
{
print("Inicializando servidor.");
//Inicializaзхes, addPlayerClass, addStaticVehicle....
return 1;
}
function::OnPlayerCommandText(playerid, cmdtext[])
{
print(cmdtext);
return 0;
}
Atй entгo й isso, o cуdigo da include estб simples, mas estб bem diferenciado,
eu criei este tуpico separado para ele pois й do meu interesse ir atualizando
e se possнvel aumentar o caso de uso dele, assim aumentando tambйm a funcionalidade.
Faзam seus testes, e podem comentar se o interesse for:
tirar dъvidas,
reportar possнveis bugs,
ideias adicionais,
postar exemplos de cуdigos utilizando a include,
pedir autуgrafos,
elogiar.