Vamos la vou tentar de uma forma mais simples explicar como as animaçoes funcionam para tentar ajudar a todos, Ate porque quem numca do nada tem o personagem atacando errado ou executando uma animaçao randomica. Vamos começar pela diferença entre .in e .inx O arquivo .in e o arquivo de texto puro, aquele que a gente consegue ler e editar de forma mais facil. La a gente usa comando tipo *착용무기 (arma equipada) e coloca a categoria do item. Exemplo WA101. O arquivo .inx é o arquivo binario. Aquele que o jogo realmente roda de forma mais very fast e mais buniss. Ta mas aonde a treta começa? Quando o jogo le o .in para criar o arquivo .inx ele nao salva a palavra "WA101", em vez disso, o codigo vai lá na sua tabela global de items (sItem) e faz um scann loop procurando a sua categoria WA101 e "anota" somente o numero da posiçao dele (ID/Index) Exemplo WA101 esta na posiçao 0 , Ou seja qual for a sua posiçao na tabela. O mesmo esquema acontence para as listas de Skills a (SkillDataCode). Ta mas porque caralhos as animaçoes realmente bugam ? Imagina comigo que o Inx foi gerado que a posiçao do machado do pristonpro foi gerado na posiçao 50, E do nada voce foi la e mudou sua tabela e agora ele esta na posiçao 65. Entao logo veja que o item ja nao e o mesmo a posiçao 50 pode ser uma staff um hammer ou um item premium enfim seja la o que for. Logo ele vai reconhecer uma animaçao errada como pode ver no exemplo abaixo se ele nao encontra ele faz um rand() nas animaçoes. if ( FindCnt ) ChangeMotion( FoundNum[(rand()%FindCnt)] , AnimDispMode ); // ROLETA RUSSA!
Alem disso existe um bug principalmente depois que foi adicionado as novas classes e novas skills como a guerreira. Muitos hoje ainda utilizam os .inx dos servidor como KPT ou BPT cada um tem suas preferencias. Esses Inx ja compilados ja estao com as posiçoes de items ja definidas no .inx compilado como por exemplo Assassin tem seus itens no index da tabela 345~~381 Shaman tem seus itens no index da tabela 308~~344 Guerreira tem seus itens no index de tabela 382~~418 #define MOTION_TOOL_MAX 104
#define MOTION_SKIL_MAX 8
struct smMOTIONINFO
{
// ... outros dados ...
int ItemCodeCount;
BYTE ItemCodeList[MOTION_TOOL_MAX]; // O PROBLEMA TÁ AQUI
DWORD dwJobCodeBit;
BYTE SkillCodeList[MOTION_SKIL_MAX];
// ... outros dados ...
};Repara naquele BYTE ItemCodeList. Na programação, uma variável do tipo BYTE só aguenta números de 0 a 255. Veja que o index dos motions ja gerado estao fora do range suportado ,E o BYTE simplesmente não consegue ler. Ele "estoura" o limite (dá overflow), salva um número bizarro no lugar e caga a animação inteira. Espero que consigam entender um pouco e tenham a curiosidade de entender um pouco mais e fazerem da forma correta para que todas as animaçoes realmente funcionem de forma correta. Abraço do God...