Просмотр полной версии : [patch/dev]Heart of the Wild
Для спеллов 24894, 17006, 17005, 17004, 17003 раньше были ауры для повышения выносливости и силы атаки, но теперь их в дбц нет.
Просмотрел все спеллы с подобными эффектами, но ни одного подходящего не нашел, кроме классовых, но не друидовских.
Выходит, что надо писать обработку без использования спеллов, т.к. их нет.
1. Менять надо базовую или итоговую выносливость при переходе в форму медведя?
2. Какие параметры у игрока для этого лучше менять?
3. Теоретически менять итоговую выносливость можно (1.02 - это коэффициент повышения выносливости от спелла 17003, т.е. 1 + 2%):
при переходе в форму медведя:
target->SetStat(STAT_STAMINA,uint32(floor(GetStat(STAT_STA MINA)*1.02)));
при выходе из формы медведя:
target->SetStat(STAT_STAMINA,uint32(ceil(GetStat(STAT_STAM INA)/1.02)));
Прогонял цикл до 100000 случайных вычислений: расчеты везде сошлись.
4. Может, есть какой-нибудь параметр, который отвечает за итоговый уровень выносливости (коэффициент)?
Insider42
11.06.2010, 22:11
Это также можно решить через патч SQL-dbc, который позволяет хранить недостающие в dbc спеллы в специальной таблице. Найти патч можете во многих пользовательских репозиториях, в т.ч. моем.
Чесно говоря я незнаю, зачем близам было нужно удалять эти спеллы из dbc, может из "вредности"? Создается впечатление что суют палки в колеса... таких спеллов и не один и не два, насчитано около 10.
Требуется решение, которое приняли бы в ядро и которое можно было бы использовать для подобных спеллов.
Это также можно решить через патч SQL-dbc, который позволяет хранить недостающие в dbc спеллы в специальной таблице. Найти патч можете во многих пользовательских репозиториях, в т.ч. моем.
Чесно говоря я незнаю, зачем близам было нужно удалять эти спеллы из dbc, может из "вредности"? Создается впечатление что суют палки в колеса... таких спеллов и не один и не два, насчитано около 10.
Ага, тоже его использую. Всё пашет. Автор Wowka321.
Insider42 у тебя маленькая ошибка, закоментированное лишнее:
SpellAuras.cpp
int32 HotWMod = (*i)->GetModifier()->m_amount;
// we should give 10% bonus instead 20% in all forms
// if(GetModifier()->m_miscvalue == FORM_CAT)
// we should give 10% bonus instead 20% in all forms
HotWMod /= 2;
Требуется решение, которое приняли бы в ядро и которое можно было бы использовать для подобных спеллов.
Это или аналогичное решение когда-либо придется принять в ядро, поскольку число таких спеллов будет явно только возрастать...
Во вложении рабочий патч за исключением небольшого косяка: при прокачке талантов в форме медведя не происходит изменения выносливости.
При смене формы все станет на свои места.
При прокачке талантов в других формах или вне форм все нормально.
Косяк совсем незначительный, но требует правки.
В патче есть условие:
if (apply && target->GetTypeId() == TYPEID_PLAYER && target->getClass() == CLASS_DRUID && target->m_form && m_modifier.m_miscvalue == STAT_STAMINA)
В форме медведя при прокачке талантов apply = false, его, по идее, вообще можно убрать.
Но спеллы для прокачки таланта имеют эффект повышения интеллекта, а остальное - думми, поэтому m_modifier.m_miscvalue == STAT_STAMINA не выполняется, т.к. приходит STAT_INTELLECT.
Для исправления косяка необходимо при изучении таланта каким-нибудь образом вызывать функцию пересчета коэффициента общей выносливости или каким-нибудь еще способом.
Есть идеи?
Получил замечания по патчу, переписал его.
Небольшой косяк по-прежнему присутствует, пока не смог исправить.
При переходе в форму медведя и обратно общий уровень выносливости меняется правильно в зависимости количества вложенных очков в талант.
Каким образом при прокачке таланта можно пересчитать общий уровень выносливости в момент прокачки в форме медведя, если у спелла эффект dummy?
Astellar
16.06.2010, 22:26
...Каким образом при прокачке таланта...HandleSpellSpecificBoosts.
Однако учитывайте, что по какой-то причине в ванильном ядре сделано так, что пассивные ауры могут вызывать HandleSpellSpecificBoosts(true) при добавлении, но при этом обделены возможностью вызова HandleSpellSpecificBoosts(false) при удалении.
Изначально там располагал обработку, но изменял TOTAL_PCT.
Что именно нужно сделать в данной функции для пересчета общего уровня выносливости?
Astellar
16.06.2010, 23:02
Посмотрите в сторону функции HandleStatModifier, очень полезна. С её помощью вся моя реализация данного таланта умещается в 11 строчек кода. При этом работает и прокачка во время нахождения в форме, и всё остальное. Как для мишки, так и для кошки.
Поделись патчем на данный талант для обучения на конкретном примере.:)
Я для себя сделал через похожие спеллы, т.к. модернизируя показатели не достиг нужного результата.
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 970d1d2..c13b014 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -6164,7 +6164,7 @@ void Aura::HandleShapeshiftBoosts(bool apply)
}
// Heart of the Wild
- if (HotWSpellId)
+ if (form == FORM_CAT || form == FORM_BEAR || form == FORM_DIREBEAR)
{
Unit::AuraList const& mModTotalStatPct = target->GetAurasByType(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAG E);
for(Unit::AuraList::const_iterator i = mModTotalStatPct.begin(); i != mModTotalStatPct.end(); ++i)
@@ -6172,10 +6172,26 @@ void Aura::HandleShapeshiftBoosts(bool apply)
if ((*i)->GetSpellProto()->SpellIconID == 240 && (*i)->GetModifier()->m_miscvalue == 3)
{
int32 HotWMod = (*i)->GetModifier()->m_amount;
- if(GetModifier()->m_miscvalue == FORM_CAT)
- HotWMod /= 2;
-
- target->CastCustomSpell(target, HotWSpellId, &HotWMod, NULL, NULL, true, NULL, this);
+ HotWMod /= 2;
+
+ if (form == FORM_CAT)
+ {
+ if (HotWMod == 2) {HotWSpellId = 30902;}
+ else if (HotWMod == 4) {HotWSpellId = 30903;}
+ else if (HotWMod == 6) {HotWSpellId = 30904;}
+ else if (HotWMod == 8) {HotWSpellId = 30905;}
+ else if (HotWMod == 10) {HotWSpellId = 30906;}
+ }
+ else
+ {
+ if (HotWMod == 2) {HotWSpellId = 19255;}
+ else if (HotWMod == 4) {HotWSpellId = 19256;}
+ else if (HotWMod == 6) {HotWSpellId = 19257;}
+ else if (HotWMod == 8) {HotWSpellId = 19258;}
+ else if (HotWMod == 10) {HotWSpellId = 19259;}
+ }
+
+ m_target->CastCustomSpell(m_target, HotWSpellId, NULL, NULL, NULL, true, NULL, this);
break;
}
}
@@ -6184,6 +6200,35 @@ void Aura::HandleShapeshiftBoosts(bool apply)
}
else
{
+ // Heart of the Wild (delete aura)
+ if (form == FORM_CAT || form == FORM_BEAR || form == FORM_DIREBEAR)
+ {
+ Unit::AuraList const& mModTotalStatPct = m_target->GetAurasByType(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAG E);
+ for(Unit::AuraList::const_iterator i = mModTotalStatPct.begin(); i != mModTotalStatPct.end(); ++i)
+ {
+ if ((*i)->GetSpellProto()->SpellIconID == 240 && (*i)->GetModifier()->m_miscvalue == 3)
+ {
+ int32 HotWMod = (*i)->GetModifier()->m_amount / 2;
+ if (form == FORM_CAT)
+ {
+ if (HotWMod == 2) {HotWSpellId = 30902;}
+ else if (HotWMod == 4) {HotWSpellId = 30903;}
+ else if (HotWMod == 6) {HotWSpellId = 30904;}
+ else if (HotWMod == 8) {HotWSpellId = 30905;}
+ else if (HotWMod == 10) {HotWSpellId = 30906;}
+ }
+ else
+ {
+ if (HotWMod == 2) {HotWSpellId = 19255;}
+ else if (HotWMod == 4) {HotWSpellId = 19256;}
+ else if (HotWMod == 6) {HotWSpellId = 19257;}
+ else if (HotWMod == 8) {HotWSpellId = 19258;}
+ else if (HotWMod == 10) {HotWSpellId = 19259;}
+ }
+ m_target->RemoveAurasDueToSpell(HotWSpellId);
+ }
+ }
+ }
if(spellId1)
target->RemoveAurasDueToSpell(spellId1);
if(spellId2)
@@ -8454,4 +8499,4 @@ void Aura::HandleAllowOnlyAbility(bool apply, bool Real)
target->UpdateDamagePhysical(BASE_ATTACK);
target->UpdateDamagePhysical(RANGED_ATTACK);
target->UpdateDamagePhysical(OFF_ATTACK);
-}
\ No newline at end of file
+}
Есть спеллы с нужными эффектами, но они принадлежат другим классам.
На этом форуме уже есть подобный хак, на за чем было его сюда копировать.:)
В патче в этой теме идет суммирование модификаторов.
По данным с офа получается, что модификаторы надо перемножать.
По данным с офа получается, что модификаторы надо перемножать.
По данным с оффа, используются старые спеллы которых нет в дбс =)
И нет совершенно никакой проблемы их использовать сейчас, взяв из старых ДБЦ. Я уже выше писал, что патч аналогичный spell_dbc придется использовать когда-нибудь, потому что более универсального решения вряд ли можно придумать.
И нет совершенно никакой проблемы их использовать сейчас, взяв из старых ДБЦ. Я уже выше писал, что патч аналогичный spell_dbc придется использовать когда-нибудь, потому что более универсального решения вряд ли можно придумать.
конечно, проблем нет - как же, dbc с того времени как там были эти спеллы вообще наверно не изменились...
конечно, проблем нет - как же, dbc с того времени как там были эти спеллы вообще наверно не изменились...
И что? Ну изменились. Формат записи в spell_dbc поменять - плевое дело...
Насчет использования близзами спеллов вне дбц в курсе.
Патч на спеллы в базе пока не принят в ядро, поэтому различные патчи на подобные спеллы имею право на существование.
Конечно имеют. Говорят, что молотком можно шуруп закрутить. Но по мне так шуруповертом гораздо удобнее, хотя он и сложнее устроен. И уж раз разговор идет про "принят-не принят" - такие отдельные патчи точно не имеют шансов на принятие, если таких шансов нет у патча на spell_dbc (или аналогичного). Конечно если я правильно понимаю логику Владимира - сначала искать общие решения, и только потом пилить частности.
Патч имеет право на существование, поэтому он есть.
Рассмотрение многих патчей идет долгое время, так что это не показатель.
Дальше лучше обсуждение по теме, а молоток и шуруп оставь при себе.:)
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot