Шанс магического крита

Ezequiel

Последний из атеистов
Местный
Сообщения
67
Розыгрыши
0
Репутация
0
Реакции
8
Баллы
860
Всем привет.
Кто владеет информацией, скажите, как считается маг Крит на птс ? Сборка гфил адвекс. Всевозможные поиски не дали положительного результата, не сходится дебит - кредит…
Если не сложно, формулу пожалуйста.

Пыэс: прошу отнестись с уважением и без грязного пафоса. Спасибо 🙏 всем добра и мира 😉
 

Ну есть же пдб от классика 3.0 загрузите в ида и посмотрите. Все формулы стали доступны. Сейчас не дома просто, так бы скинул вам формулу. Файл тоталчекер и пдб к нему из пакета тест лсервер.

Ну а если уж не хочется достоверку в ида брать, на максчитерсе гайтис разбирал от ц4 маг Крит формулу где то в птс разделе.

вот так выглядит функция в ида классика.

C++:
double __fastcall L2SkillFunc::GetMagicCriticalProb(
        CCreature *skillUser,
        CObject *target,
        const CSkillInfo *pSkillInfo,
        long double witBonus)
{
  std::_Tree_node<std::pair<int const ,int>,void *> *Myhead; // r9
  std::_Tree_node<std::pair<int const ,int>,void *> *v8; // rax
  std::_Tree_node<std::pair<int const ,int>,void *> *Parent; // r10
  double m_Per; // xmm7_8
  double m_Diff; // xmm8_8
  CCreature *v13; // rax
  double v14; // xmm0_8
  double m_MagicCriticalRate; // xmm1_8
  double v16; // xmm7_8
  int v17; // edi
  double v18; // xmm0_8
  double v19; // xmm6_8
  double v20; // xmm7_8

  if ( pSkillInfo )
  {
    Myhead = skillUser->m_SkillMod.m_mapSkillCritical._Mypair._Myval2._Myval2._Myhead;
    v8 = Myhead;
    Parent = Myhead->_Parent;
    while ( !Parent->_Isnil )
    {
      if ( Parent->_Myval.first >= pSkillInfo->m_nSkillId )
      {
        v8 = Parent;
        Parent = Parent->_Left;
      }
      else
      {
        Parent = Parent->_Right;
      }
    }
    if ( v8 == Myhead || pSkillInfo->m_nSkillId < v8->_Myval.first )
      v8 = skillUser->m_SkillMod.m_mapSkillCritical._Mypair._Myval2._Myval2._Myhead;
    if ( v8 != Myhead )
      return (double)v8->_Myval.second;
  }
  m_Per = DOUBLE_1_0;
  m_Diff = 0.0;
  if ( target->IsCreature(target) )
  {
    v13 = target->CastCreature(target);
    if ( v13->m_SkillMod.m_Mods[49].m_Diff != 0.0 || v13->m_SkillMod.m_Mods[49].m_Per != 1.0 )
    {
      m_Per = v13->m_SkillMod.m_Mods[49].m_Per;
      m_Diff = v13->m_SkillMod.m_Mods[49].m_Diff;
    }
  }
  v14 = (double)skillUser->m_data->m_nOrgParam[10];
  if ( pSkillInfo )
  {
    m_MagicCriticalRate = pSkillInfo->m_MagicCriticalRate;
    if ( m_MagicCriticalRate != 0.0 )
      v14 = v14 + m_MagicCriticalRate;
  }
  v16 = m_Per * skillUser->m_SkillMod.m_Mods[15].m_Per * (v14 * witBonus)
      + m_Diff
      + skillUser->m_SkillMod.m_Mods[15].m_Diff;
  v17 = skillUser->Level(skillUser);
  if ( v17 < 78 && target->Level(target) < 78 )
  {
    v18 = DOUBLE_0_5;
    if ( v16 >= 0.5 )
    {
      v18 = DOUBLE_50_0;
      if ( v16 <= 50.0 )
        return v16;
    }
    return v18;
  }
  v19 = (double)(int)(v17 - ((__int64 (__fastcall *)(CObject *))target->Level)(target));
  v20 = v16 + sqrt((double)v17) * v19 / 25.0;
  if ( v20 >= 0.5 )
    return fmin(32.0, v20);
  return DOUBLE_0_5;
}

вызывается она вот отсюда

Код:
double __fastcall L2SkillFunc::GetMagicCritical(
        CCreature *skillUser,
        CObject *target,
        const CSkillInfo *pSkillInfo,
        long double witBonus)
{
  int m_nIsMagic; // r9d
  bool v7; // zf
  long double MagicCriticalProb; // xmm0_8
  CCreature *v9; // rax

  if ( pSkillInfo )
  {
    m_nIsMagic = pSkillInfo->m_nIsMagic;
    v7 = m_nIsMagic == 0;
    if ( m_nIsMagic < 0 )
    {
LABEL_7:
      if ( v7 || m_nIsMagic == 6 )
        return DOUBLE_1_0;
      goto LABEL_9;
    }
    if ( m_nIsMagic < 10 )
      goto LABEL_6;
    if ( m_nIsMagic <= 13 )
      return DOUBLE_1_0;
    if ( (unsigned int)(m_nIsMagic - 20) > 5 )
    {
LABEL_6:
      v7 = m_nIsMagic == 0;
      goto LABEL_7;
    }
  }
LABEL_9:
  MagicCriticalProb = L2SkillFunc::GetMagicCriticalProb(skillUser, target, pSkillInfo, witBonus);
  if ( MagicCriticalProb > genrand64_real1() * 100.0 + 0.0 )
  {
    v9 = target->CastCreature(target);
    CCreature::SendMagicAttckInfo(skillUser, v9, Block);
    skillUser->SendSystemMessage(skillUser, 1280u);
    return DOUBLE_2_0;
  }
  return DOUBLE_1_0;
}

сори, не успел в один пост, в С4 выглядит вот так вот:

C++:
v19 = pCreature->vtable->CCreature::GetBaseStatWIT(pCreature);

v19 * 0.5 * pCreature->d.magicCriticalRatePER + pCreature->d.magicCriticalRateDIFF > (double)rand(v20) / 32767.0 * (100.0 - 0.0) + 0.0 && pCreature->vtable->base.base.base.IsUser((MemoryObject *)pCreature)
 
Назад
Сверху Снизу