Форумы SDlive

Форумы SDlive (http://forum.sdlive.ru/index.php)
-   Клуб нытиков (http://forum.sdlive.ru/forumdisplay.php?f=75)
-   -   Спасение утопающих - дело рук самих утопающих (http://forum.sdlive.ru/showthread.php?t=3517)

animagus 09.10.2009 07:02

Спасение утопающих - дело рук самих утопающих
 
Так как наши админы не могут/не хотят/не успевают фиксить спеллы и таланты у меня возникло желание научиться это делать самому. Было бы неплохо если кто-нибудь объяснил как это делать.
Пример спелл lifebloom
http://github.com/mangos/mangos/raw/...SpellAuras.cpp
Код:

            // Lifebloom
            if (GetSpellProto()->SpellFamilyFlags & UI64LIT(0x1000000000))
            {
                if ( apply )
                {
                    if ( caster )
                        // prevent double apply bonuses
                        if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
                            m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
                }
                else
                {
                    // Final heal only on dispelled or duration end
                    if ( !(GetAuraDuration() <= 0 || m_removeMode == AURA_REMOVE_BY_DISPEL) )
                        return;

                    // have a look if there is still some other Lifebloom dummy aura
                    Unit::AuraList const& auras = m_target->GetAurasByType(SPELL_AURA_DUMMY);
                    for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
                        if((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID &&
                            ((*itr)->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x1000000000)))
                            return;

                    // final heal
                    if(m_target->IsInWorld() && m_stackAmount > 0)
                    {
                        int32 amount = m_modifier.m_amount / m_stackAmount;
                        m_target->CastCustomSpell(m_target, 33778, &amount, NULL, NULL, true, NULL, this, GetCasterGUID());

                        if (caster)
                        {
                            int32 returnmana = (GetSpellProto()->ManaCostPercentage * caster->GetCreateMana() / 100) * m_stackAmount / 2;
                            caster->CastCustomSpell(caster, 64372, &returnmana, NULL, NULL, true, NULL, this, GetCasterGUID());
                        }
                    }
                }
                return;
            }

Меня больше всего что происходит в строчках, которые как раз соотвествуют сломанному финальноу тику.
Код:

int32 amount = m_modifier.m_amount / m_stackAmount;
m_target->CastCustomSpell(m_target, 33778, &amount, NULL, NULL, true, NULL, this, GetCasterGUID());

m_stackAmount - если я правильно понял это количество стаков(но зачем на него делить?)
33778 - видимо id спелла отвечающего за финальный тик

version 09.10.2009 07:34

Такая инициативность радует.
Контрибьютинг в код делают тех-гмы, в данный момент SeT.
Администрация контрибьютингом в код не занимается.

Соответственно по вопросам как и что можно спросить у SeT'а

SeT 09.10.2009 09:51

Ну да, все так.

Fenix 09.10.2009 09:57

Цитата:

Сообщение от SeT (Сообщение 84481)
Ну да, все так.

:D Set не в обиду тебе но комент заставил поржать :)
человек просит помощи разобраться в коде талантов/спелов
Цитата:

Сообщение от animagus (Сообщение 84465)
у меня возникло желание научиться это делать самому. Было бы неплохо если кто-нибудь объяснил как это делать.

возможно грядет еще 1 техник?

animagus 09.10.2009 10:08

Ну раз:
Цитата:

Сообщение от SeT (Сообщение 84481)
Ну да, все так.

Тогда получается что если выкинуть из строчки
Код:

int32 amount = m_modifier.m_amount / m_stackAmount;
деление на m_stackAmount то финальный тик начнет увеличиваться пропорционально количеству стаков(что и долно быть).
-А где посмотреть спелл №33778 чтобы проверить спелл повер кофицент?
-И где считается m_modifier.m_amount?

Winger 09.10.2009 10:13

Цитата:

Сообщение от animagus (Сообщение 84486)
-А где посмотреть спелл №33778 чтобы проверить спелл повер кофицент?

Прибавляешь к "http://www.wowhead.com/?spell=" цифирки "33778" и получаешь ссылку на спелл: http://www.wowhead.com/?spell=33778

SeT 09.10.2009 10:17

Че я буду тут рассказывать все теорию С++ и кода мангоса? Береш ставиш сервер, запускаеш в дебаге, и дебагаеш по строчке.

Остановил на этой строчке
Цитата:

int32 amount = m_modifier.m_amount / m_stackAmount;
и там будет все написано, чему равно m_modifier.m_amount и m_stackAmount, все сразу станет понятно.

А где посмотреть спелл №33778 чтобы проверить спелл повер кофицент?
В таблице spell_bonus_data, у нас нет этого спелла там, значит идет стандартный расчет.

И где считается m_modifier.m_amount?
m_modifier заполняется при наложении ауры.

animagus 09.10.2009 10:44

Цитата:

А где посмотреть спелл №33778 чтобы проверить спелл повер кофицент?
В таблице spell_bonus_data, у нас нет этого спелла там, значит идет стандартный расчет.
По стандартному расчету кофицент для Спелл повера выставляется 0(должен быть около 50%)Так и должно быть?
Может тогда обьяснишь вкратце как ставить сервер?

SeT 09.10.2009 11:22

Цитата:

Сообщение от animagus (Сообщение 84493)
Может тогда обьяснишь вкратце как ставить сервер?

нет. getmangos.ru

animagus 25.11.2009 14:31

For hunters
 
Вложений: 1
По идее добавление этого в таблицу npc_trainer должно исправить баг с черной стрелой.


Часовой пояс GMT +1, время: 15:56.