O que é hateffect? a gravity para não ocupar slot visual que já estava 100% ocupado, então decidiu criar o hateffect possivel chama-lo através de um simples script e ele ficará permanente, ótimo para auras, efeitos que tem o intuito de ficarem em loop infinitos.
Instalando um hateffect é muito simples, primeiro precisamos remover algumas restrições
(essa alteração é necessária apenas 1 única vez)
Abra seu emulador rathena e procure src/map/script.cpp e procure por:
BUILDIN_FUNC(hateffect){

e comente as linhas:
if( effectID <= HAT_EF_MIN || effectID >= HAT_EF_MAX ){
ShowError( "buildin_hateffect: unsupported hat effect id %d\n", effectID );
return SCRIPT_CMD_FAILURE;
}
e ficará:

apos ter feito isso abra o script.hpp e procure por:
EF_SPRITEMABLE,
EF_TUNAPARTY,
EF_MAX
};
enum e_hat_effects {
e adicione:
EF_SPRITEMABLE,
EF_TUNAPARTY,
EF_MAX
= 9999
};
enum e_hat_effects {
Apos isso você pode compilar seu emulador!
Vamos agora para a parte do client:
Para instalar o hateffect agora removemos a restrição que seria necessário toda vez que adicionar o hateffect também adicionar no script_constant.hpp (mas agora não é mais necessário)
abra o hateffectinfo.lub em data/luafiles514/lua files/hateffectinfo/
e você verá isso:

Aqui vai até o numero 217, ele segue sempre um unico padrão:
* o meu vai até o numero 217 pois tenho vários custons, então provavel que o seu vá ter menos. mas a quantidade não importa, o importante é esta na sequencia certa.
HAT_NOME_DO_EFEITO = numero sequencial,
HAT_NOME = 111,
* Muito importante: o numero não pode ter pulos, tem que ser sequencial, por exemplo:HAT_EF1 = 110,
HAT_EF2 = 120,
O correto é:HAT_EF1 = 110,
HAT_EF2 = 111,
Seguindo, vamos criar o HAT_EF_CUSTOM_FROST = 218,

agora vamos ao final do hatEffectTable = { no mesmo arquivo.

Eu usei:
--- Exemplo:
[HatEFID.HAT_EF_CUSTOM_FROST] = { resourceFileName = "custom\exemplo\aura.str", isIgnoreRiding = true, isRenderBeforeCharacter = true, hatEffectPos = -4, hatEffectPosX = 0},Azul = comentário (--- exemplo:)
Laranja = nome da variavel que escolhemos e o ID( HAT_EF_CUSTOM_FROST)
Amarelo = caminho que será achado o efeito .str ( "custom\exemplo\aura.str" )
* Alguns dos recursos citados a baixo podem funcionar só no hexed 2018+ ou 2020+
IsIgnoreRiding: se for true ao montar um uma montaria ou peco peco o hateffect não irá subir, ele irá ignorar essa ação
isRenderBeforeCharacter: Se for true ao usar o hateffect ele ficará por cima do personagem.
hatEffectPos: Posiciona a ancora Y(cima e baixo) do hateffect
hatEffectPosX: Posiciona a ancora X(esquerda direita) do hateffect
Apos ter feito isso de adicionado no arquivo hateffectinfo.lub vamos adicionar os arquivos na pasta data/texture/effect/custom/exemplo/

Aqui esta meu efeito, apos isso eu vou no jogo e uso um script básico para testa-lo
prontera,155,179,5 script frost_teste 810,{
end;
OnMy:
input .@number;
hateffect .@number,true;
end;
OnMy2:
hateffect 218,true;
end;
OnInit:
bindatcmd "efc",strnpcinfo(3)+"::OnMy";
bindatcmd "ef",strnpcinfo(3)+"::OnMy2";
}
Ao usar o @ef eu terei hateffect 218 ativo, se eu usar o @efc terei que por um numero para ativa-lo. (é muito bom para testes)
ingame vamos ver o efeito:

Agora vamos aprender como deixa-lo permanente mesmo usando o /effect
Obs: os hateffects são aparti do @effect 1241+ no meu client, o de vocês podem ser um pouco mais caso tenha mais efeitos nos novos clients;
você pode usar o @effect 1241+ até achar, como eu tenho 218 efeitos eu sei que é o @effect 1459 (1241+218)
Apos saber o numero correto e testa-lo ingame, eu vou em luafiles514/lua files/effecttool e procuro por forcerendereffect.lub
vamos encontrar:

no final do arquivo, adicione:--- exemplo
1459,
}

Pronto, agora você pode usar /effect e nunca mais desligará.