• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Форум » TrinityCore » [TrinityCore] Help » Проблема %
Проблема %
rkild511
Сержант
Собственно вот сам вопрос
в HandleModDamagePercentDone не правильный пересчёт идёт, он вместо того чтобы складывать проценты перемножает их ( и не совсем правильно )
Вот код из SpellAuraEffect.cpp
Код
void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
    if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
        return;

    Unit* target = aurApp->GetTarget();
    if (!target)
        return;

    if (target->GetTypeId() == TYPEID_PLAYER)
    {
        for (int i = 0; i < MAX_ATTACK; ++i)
            if (Item* item = target->ToPlayer()->GetWeaponForAttack(WeaponAttackType(i), false))
                target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply);
    }

    if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER))
    {
        target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND,         TOTAL_PCT, float (GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND,          TOTAL_PCT, float (GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED,           TOTAL_PCT, float (GetAmount()), apply);

        if (target->GetTypeId() == TYPEID_PLAYER)
            target->ToPlayer()->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float (GetAmount()), apply);
    }
    else
    {
        // done in Player::_ApplyWeaponDependentAuraMods for SPELL_SCHOOL_MASK_NORMAL && EquippedItemClass != -1 and also for wand case
    }
    }

Потом я поменял это на:
Код
void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
    if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
  return;

    Player* target = aurApp->GetTarget()->ToPlayer();
    if (!target)
  return;

    if (target->HasItemFitToSpellRequirements(GetSpellInfo()))
    {
  target->ApplyModSignedFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, GetAmount() / 100.0f, apply);
  target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply);
  target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetAmount()), apply);
  target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(GetAmount()), apply);
    }
}


Писать стало правильно, пересчёт был, но вот всё равно урона прибавляет больше чем надо.
То есть сейчас он правильное кол-во % пишет, но вот урона добавляет точно так же как и было раньше
потом я понял что проблема в
Код
target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply);
  target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetAmount()), apply);
  target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(GetAmount()), apply);

И заменил на:
Код
target->UpdateDamagePhysical(BASE_ATTACK);
  target->UpdateDamagePhysical(OFF_ATTACK);
  target->UpdateDamagePhysical(RANGED_ATTACK);

Теперь он просто не добавляет ничего, но правильно пишет(
Кто может, помогите:)

Добавлено (16.03.2016, 15:31)
---------------------------------------------
Так же ещё интересно что означает: TOTAL_PCT?
и TOTAL_VALUE?
Сообщение # 1 отредактировано rkild511 - Среда, 16.03.2016, 15:31
dimakpro
Центурион
Странно,а в тех ядрах (старых) вроде уже есть этот фикс( кто занимался фан сборками)

void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
    if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
        return;

    Unit* target = aurApp->GetTarget();
    int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
    if (abs(spellGroupVal) >= abs(GetAmount()))
        return;

    if (target->GetTypeId() == TYPEID_PLAYER)
    {
        for (int i = 0; i < MAX_ATTACK; ++i)
            if (Item* item = target->ToPlayer()->GetWeaponForAttack(WeaponAttackType(i), false))
                target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply);
    }

    if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER))
    {
        if (spellGroupVal)
        {
            target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(spellGroupVal), !apply);
            target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(spellGroupVal), !apply);
            target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(spellGroupVal), !apply);
        }
        target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND,  TOTAL_PCT, float(GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED,   TOTAL_PCT, float(GetAmount()), apply);

        if (Player* player = target->ToPlayer())
        {
            if (spellGroupVal)
                player->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float(spellGroupVal), !apply);

            player->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float(GetAmount()), apply);
        }
    }
    else
    {
        // done in Player::_ApplyWeaponDependentAuraMods for SPELL_SCHOOL_MASK_NORMAL && EquippedItemClass != -1 and also for wand case
    }
}
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 2 отредактировано dimakpro - Пятница, 18.03.2016, 11:54
rkild511
Сержант
Цитата dimakpro ()
void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 mode, bool apply) const{
    if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
        return;

    Unit* target = aurApp->GetTarget();
    int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
    if (abs(spellGroupVal) >= abs(GetAmount()))
        return;

    if (target->GetTypeId() == TYPEID_PLAYER)
    {
        for (int i = 0; i < MAX_ATTACK; ++i)
            if (Item* item = target->ToPlayer()->GetWeaponForAttack(WeaponAttackType(i), false))
                target->ToPlayer()->_ApplyWeaponDependentAuraDamageMod(item, WeaponAttackType(i), this, apply);
    }

    if ((GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) && (GetSpellInfo()->EquippedItemClass == -1 || target->GetTypeId() != TYPEID_PLAYER))
    {
        if (spellGroupVal)
        {
            target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(spellGroupVal), !apply);
            target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(spellGroupVal), !apply);
            target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(spellGroupVal), !apply);
        }
        target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND,  TOTAL_PCT, float(GetAmount()), apply);
        target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED,   TOTAL_PCT, float(GetAmount()), apply);

        if (Player* player = target->ToPlayer())
        {
            if (spellGroupVal)
                player->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float(spellGroupVal), !apply);

            player->ApplyPercentModFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, float(GetAmount()), apply);
        }
    }
    else
    {
        // done in Player::_ApplyWeaponDependentAuraMods for SPELL_SCHOOL_MASK_NORMAL && EquippedItemClass != -1 and also for wand case
    }
}
собственно это код из нового ядра тринити, в моей ревизии нету упоминания о spellGroupVal и соответственно есть ошибка
Сообщение # 3 написано 18.03.2016 в 20:00
dimakpro
Центурион
А разработчику ядра писал?) И что за ядро?
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 4 написано 18.03.2016 в 20:13
rkild511
Сержант
Цитата dimakpro ()
А разработчику ядра писал?) И что за ядро?
эм зачем ему писать? если как бы я скачал тринити кор ( в 12 году ) и просто добавлял в него функции
то есть как бы я разраб:)
Сообщение # 5 отредактировано rkild511 - Пятница, 18.03.2016, 21:07
dimakpro
Центурион
rkild511,я так думаю офф ядро за 2016  год более  менее норм)
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 6 написано 18.03.2016 в 21:26
rkild511
Сержант
Цитата dimakpro ()
,я так думаю офф ядро за 2016  год более  менее норм)
да меня моё устраивает) просто переносить всё заколебусь, а вот баг поправить не отказался бы.
Сообщение # 7 написано 18.03.2016 в 21:33
dimakpro
Центурион
Ну конечно,если столько времени потратил на своё ядро,то понятное дело,подобная тема есть на Github "zwisus commented 8 days ago
Description:
if a player cast a spell that has a EffectWeaponDmg effect,and the spell school isn't NORMAL,at the same time,
the player has a SPELL_AURA_MOD_DAMAGE_PERCENT_DONE aura,
the spell damge is wrong.

Current behaviour:
Caster hasaura(72221)
Luck of the Draw
Stacks up to 3 times
Increases damage done by 5%, healing done by 5%, and health by 5% whenever you use the Dungeon tool to find other players for your group.

castspell(20375)
trigger spell id 20424
Seal Of Command
the Seal Of Command damage should increase to 105%,but it increased to 105% x 105%.

Branch(es): 335/6x
335

TC hash/commit:
a41bd8e

TDB version:
TDB 335.60" пока ещё некто не ответил) Та же проблема)
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 8 написано 18.03.2016 в 21:41
rkild511
Сержант
Цитата dimakpro ()
Ну конечно,если столько времени потратил на своё ядро,то понятное дело,подобная тема есть на Github "zwisus commented 8 days agoDescription:
if a player cast a spell that has a EffectWeaponDmg effect,and the spell school isn't NORMAL,at the same time,
the player has a SPELL_AURA_MOD_DAMAGE_PERCENT_DONE aura,
the spell damge is wrong.

Current behaviour:
Caster hasaura(72221)
Luck of the Draw
Stacks up to 3 times
Increases damage done by 5%, healing done by 5%, and health by 5% whenever you use the Dungeon tool to find other players for your group.

castspell(20375)
trigger spell id 20424
Seal Of Command
the Seal Of Command damage should increase to 105%,but it increased to 105% x 105%.

Branch(es): 335/6x
335

TC hash/commit:
a41bd8e

TDB version:
TDB 335.60" пока ещё некто не ответил) Та же проблема)
я на самом деле частично решил свою проблему, написал небольшую формулу, позволяет до 7к% всё нормально делать, но вот после начинаются артефакты:)
Сообщение # 9 написано 19.03.2016 в 01:27
dimakpro
Центурион
rkild511,уважающий себя админ не будет  делать крейзи,так как крейзи только для школьников и онлайн макс 15-20 тел будет)Большие статы и берсы,это сейчас не актуально) Даже  в xtreame top 100 серверов,я не видел среди топовых крейзи)
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 10 написано 19.03.2016 в 09:20
rkild511
Сержант
Цитата dimakpro ()
rkild511,уважающий себя админ не будет  делать крейзи,так как крейзи только для школьников и онлайн макс 15-20 тел будет)Большие статы и берсы,это сейчас не актуально) Даже  в xtreame top 100 серверов,я не видел среди топовых крейзи)
крейзи крейзи рознь:D
Сообщение # 11 написано 19.03.2016 в 12:35
dimakpro
Центурион
rkild511,по твоей проблеме написал на git hub trinitycore и на паре форумов американских) думаю за пару дней дадут решение данной проблемы)
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 12 написано 19.03.2016 в 20:48
rkild511
Сержант
скажи ссылки, сам мониторить буду тоже их
Сообщение # 13 написано 22.03.2016 в 23:03
dimakpro
Центурион
Продажа сервера wow blood-fire (WoW 3.3.5a + Lua engine) 6500 руб
---->https://vk.com/jimteck<----
Сообщение # 14 отредактировано dimakpro - Четверг, 24.03.2016, 00:30
Форум » TrinityCore » [TrinityCore] Help » Проблема %
  • Страница 1 из 1
  • 1
Поиск: