Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Dif] Szansa na drop z żył


Rekomendowane odpowiedzi

Opublikowano

This difference file has been created JachuPL

game_r2089M_32
00113C0F: 64 02

 

Funkcja działa w taki sposób, że losuje liczbę z zakresu 1-100 (hex 1-64). Tutaj liczba jest losowana z zakresu 1-2. Testowane, działa.

 

 

Psource:

przed zmianą

 v8 = mining::GetOrePct(v2);
if ( v8 >= number_ex(1, 100, (int)"mining.cpp", 354) )
{
v10 = CHARACTER::GetRaceNum(v15);
mining::OreDrop(v2, v10);
v12 = &unk_8355428;
}
else
{
v12 = (_UNKNOWN *)"+Ą-Ą?í ŻăĂđă¤?+ŻL+¤+-.";
}

po zmianie

 v8 = mining::GetOrePct(v2);
if ( v8 >= number_ex(1, 2, (int)"mining.cpp", 354) )
{
v10 = CHARACTER::GetRaceNum(v15);
mining::OreDrop(v2, v10);
v12 = &unk_8355428;
}
else
{
v12 = (_UNKNOWN *)"+Ą-Ą?í ŻăĂđă¤?+ŻL+¤+-.";
}

 

 

@Dest:

v2 = CHARACTER_MANAGER::FindByPID(singleton<CHARACTER_MANAGER>::ms_singleton, *(_DWORD *)v1);

Funkcja zwraca szansę na drop z żyły o ID, które jest szukane po PID (zawiłe, nie? Chodzi o to, że każdy obiekty typu mob/npc ma własne, niestałe PID, po którym jest sprawdzane ID obiektu). btw gz kida <3

 

 

//edit: oto funkcja, która odpowiada za % dropu z żyły.

 

int __cdecl mining::GetOrePct(int a1)
{
int v1; // edi@1
int v2; // eax@1
int v3; // ecx@1
int v4; // esi@1
int v5; // eax@2
int result; // eax@4
int v7; // ebx@7
int v8; // eax@7
int v9; // [sp+18h] [bp-10h]@1

v9 = *(_DWORD *)_stack_chk_guard__FBSD_1_0;
v1 = CHARACTER::GetSkillLevel(a1, 124);
v2 = CHARACTER::GetWear(a1, 4);
v4 = v2;
if ( v2 && (v5 = *(_DWORD *)(v2 + 68)) != 0 && *(_BYTE *)(v5 + 54) == 24 )
{
v7 = *(_DWORD *)&mining::SkillLevelAddPct[4 * MINMAX(0, v1, 40)];
v8 = CItem::GetRefineLevel(v4);
result = *(_DWORD *)&mining::PickGradeAddPct[4 * MINMAX(0, v8, 9)] + v7 + 20;
}
else
{
result = 0;
}
if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != v9 )
__stack_chk_fail(v3, *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ v9);
return result;
}

 

wyróżniają się w niej wzory

result = *(_DWORD *)&mining::PickGradeAddPct[4 * MINMAX(0, v8, 9)] + v7 + 20;
v7 = *(_DWORD *)&mining::SkillLevelAddPct[4 * MINMAX(0, v1, 40)];

 

Jak widzimy, losowana jest liczba z zakresu 0-9, mnożona przez 4, dodawane jest v7 i dodawane jest 20.

v7 to nic innego jak procent określany przez poziom umiejętności Górnictwo. Tu pobierany jest poziom umiejętności i mnożony razy 4.

 

PS: Destruktę, byłbym wdzięczny jakbyś sprawdził mój tok rozumowania pod kątem błędów. z góry dzięki ;)

57199140501148694665.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...