SANCTUAIRE - OpenMMO/openMMO GitHub Wiki

##Calcul du sanctuaire en fonction des coordonnées et vis-versa

Cette page vous expose l'algorithme de calcul du sanctuaire en fonction des coordonnées et de la récupération des coordonnées en fonction du sanctuaire.

##Reverse

Pour la recherche assembleur j'ai effectué une simple recherche sur la valeur 20020 (4E34h) qui est l'identifiant du flag sanctuaire d'un personnage.

.text:0041C5BC loc_41C5BC:                             ; CODE XREF: Character::Death(_ATTACK_STRUCTURE *,Unit *)+1279 j
.text:0041C5BC                                         ; Character::Death(_ATTACK_STRUCTURE *,Unit *)+1366 j
.text:0041C5BC                 mov     edx, [esi]
.text:0041C5BE                 push    ebx
.text:0041C5BF                 push    4E34h           ; Id du flag sanctuaire (20020 en décimale)
.text:0041C5C4                 mov     ecx, esi
.text:0041C5C6                 mov     [ebp+var_30], ebx
.text:0041C5C9                 call    dword ptr [edx+0Ch] ; Lecture de la valeur contenue dans le flag 20020
.text:0041C5CC                 cmp     eax, ebx
.text:0041C5CE                 jz      short loc_41C617
.text:0041C5D0                 mov     edi, eax
.text:0041C5D2                 mov     ebx, eax
.text:0041C5D4                 and     eax, 0FFh       ; 255 en décimal
.text:0041C5D9                 shr     edi, 14h        ; Decalage des bits vers la droite de 20
.text:0041C5DC                 shr     ebx, 8          ; Décalage des bits vers la droite de 8
.text:0041C5DF                 push    eax
.text:0041C5E0                 and     edi, 0FFFh      ; 4095 en décimal
.text:0041C5E6                 and     ebx, 0FFFh      ; 4095 en décimal
.text:0041C5EC                 mov     [ebp+var_80], eax
.text:0041C5EF                 call    ?GetWorld@TFCMAIN@@SAPAVWorldMap@@G@Z ; TFCMAIN::GetWorld(ushort)
.text:0041C5F4                 add     esp, 4
.text:0041C5F7                 test    eax, eax
.text:0041C5F9                 jz      short loc_41C617
.text:0041C5FB                 xor     ecx, ecx
.text:0041C5FD                 mov     cx, [eax+2Ch]
.text:0041C601                 cmp     edi, ecx
.text:0041C603                 jge     short loc_41C617
.text:0041C605                 xor     edx, edx
.text:0041C607                 mov     dx, [eax+2Eh]
.text:0041C60B                 cmp     ebx, edx
.text:0041C60D                 jge     short loc_41C617
.text:0041C60F                 test    edi, edi
.text:0041C611                 jl      short loc_41C617
.text:0041C613                 test    ebx, ebx
.text:0041C615                 jge     short loc_41C62B
.text:0041C617

Dans notre cas, vu que le calcul du sanctuaire est relativement simple, nous ne chercherons pas dans le désassembleur la fonction inverse de celui-ci, une simple réécriture inverse de notre algorithmes suffira pour en avoir l'envers.

##Algorithme du calcul du sanctuaire

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int x = 1400, y = 400, w = 0;
    __int64 sanctuary = 0;
    
    cout << "Start coordinates : " << x << "," << y << "," << w << "\n";
    
    sanctuary = ((short)x << 20) +  ((short)y << 8) + (short)w; // (x * 1048576) + (y * 256) + w;
    cout << "Sanctuary : " << sanctuary << "\n";
   
    x = ((short)(sanctuary >> 20) & 0x0FFF);
    y = ((short)(sanctuary >> 8) & 0x0FFF);
    w = sanctuary & 0x0FF;
    cout << "Calculates the coordinates : " << x << "," << y << "," << w << "\n";
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
⚠️ **GitHub.com Fallback** ⚠️