Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2010, 20:03   #1
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию Heart of the Wild

Решил покопать друидовский талант Heart of the Wild. Вижу, что он имеет DUMMY эффект, причем m_spellInfo->SpellFamilyName равно SPELLFAMILY_GENERIC, а не SPELLFAMILY_DRUID. Понимаю, что реализовывать талант в SPELLFAMILY_GENERIC не следует, но спелл имеет только два эффекта: один Apply Aura: Mod Total Stat для интеллекта и второй DUMMY, для выносливости в облике медведя и лютого медведя и силы атаки в облике кошки. Как быть, где реализовывать выносливость и силу атаки?
xmolex вне форума   Ответить с цитированием
Старый 12.04.2010, 20:09   #2
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от xmolex Посмотреть сообщение
Решил покопать друидовский талант Heart of the Wild. Вижу, что он имеет DUMMY эффект, причем m_spellInfo->SpellFamilyName равно SPELLFAMILY_GENERIC, а не SPELLFAMILY_DRUID. Понимаю, что реализовывать талант в SPELLFAMILY_GENERIC не следует, но спелл имеет только два эффекта: один Apply Aura: Mod Total Stat для интеллекта и второй DUMMY, для выносливости в облике медведя и лютого медведя и силы атаки в облике кошки. Как быть, где реализовывать выносливость и силу атаки?
Ну ты намудрил
1) Реализуется данный спелл в двух местах кода: Для первого эффекта - Apply Aura: Mod Total Stat Для второго эффекта - DUMMY (скорее всего, в аурах)
2) SPELLFAMILY_GENERIC - это не место рализации, а способ определения спелла по типу в "кейсе" (case). И будет данный спелл работать именно в этом "кейсе" и никогда не сработает, если ты поместишь его в SPELLFAMILY_DRUID.
Вот так

Щас ещё глянул, вторая часть спелла, вероятнее всего, должны быть реализована в Unit.cpp при смене формы - ну это уже надо глубже копать, возможны варианты...

P.S: Где смотрел инфу о спелле вообще?
P.P.S: Нормальная тема... перенёс туда, где ей больше подходит быть.
KiriX вне форума   Ответить с цитированием
Старый 12.04.2010, 20:20   #3
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
(скорее всего, в аурах)
Можно поподробнее. Насколько я знаю ауры - это ауры, а dummy - это dummy.

Цитата:
Сообщение от KiriX Посмотреть сообщение
2) SPELLFAMILY_GENERIC - это не место рализации, а способ определения спелла по типу в "кейсе" (case). И будет данный спелл работать именно в этом "кейсе" и никогда не сработает, если ты поместишь его в SPELLFAMILY_DRUID.
Вот так

Щас ещё глянул, вторая часть спелла, вероятнее всего, должны быть реализована в Unit.cpp при смене формы - ну это уже надо глубже копать, возможны варианты...

P.S: Где смотрел инфу о спелле вообще?
SPELLFAMILY_GENERIC - я подразумевал область с кодом когда SpellFamilyName равен SPELLFAMILY_GENERIC.

Инфу смотрел в spell_work (правда под 3.3.2). Сейчас есть кусок кода для таланта в SpellAuras.cpp в void Aura::HandleShapeshiftBoosts(bool apply), но разве это правильно?

Последний раз редактировалось xmolex; 12.04.2010 в 20:31.
xmolex вне форума   Ответить с цитированием
Старый 12.04.2010, 20:37   #4
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от xmolex Посмотреть сообщение
1) Можно поподробнее. Насколько я знаю ауры - это ауры, а dummy - это dummy.


2) SPELLFAMILY_GENERIC - я подразумевал область с кодом когда SpellFamilyName равен SPELLFAMILY_GENERIC.

3) Инфу смотрел в spell_work (правда под 3.3.2).
4)Сейчас есть кусок кода для таланта в SpellAuras.cpp в void Aura::HandleShapeshiftBoosts(bool apply), но разве это правильно?
1) Ага. Есть думми ауры. Я лишь имел ввиду, что думми эффекты должны реализовываться в думми обработчике, как и другие эффекты - каждый в своём обработчике. Но ещё важнее то, что думми означает, что это серверный скрипт и он может быть впихнут куда угодно в зависимости от того, что нужно реализовать данным эффектом.
2) Ага. Всё верно, если бы так сразу и написал. Однако это ничего не меняет. Если спелл (пусть и друлевский) имеет фамилинейм SPELLFAMILY_GENERIC - значит он должен быть помещён в кейс SPELLFAMILY_GENERIC иначе не будет обрабатываться вообще.
3) Смотрел по старым ДБЦ? Если да, то они могли устареть
4) Совершенно верно - там и нужно обрабатывать. Кусок кода проверяет наличие ауры таланта на персе при превращении и в зависимости от того, в кого тюлень перекидывается вешает тот или иной эффект. А что именно сейчас не работает?
KiriX вне форума   Ответить с цитированием
Старый 12.04.2010, 20:42   #5
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
3) Смотрел по старым ДБЦ? Если да, то они могли устареть
4) Совершенно верно - там и нужно обрабатывать. Кусок кода проверяет наличие ауры таланта на персе при превращении и в зависимости от того, в кого тюлень перекидывается вешает тот или иной эффект. А что именно сейчас не работает?
3) Смотрел по старым, но отладку проводил под 3.3.3. Исключение срабатывало при SPELLFAMILY_GENERIC.
4) Тогда получается, что в DUMMY у нас просто так заворачивается, не совсем правильно как-то. Ладно, будем в HandleShapeshiftBoosts править.
Не работает "Также повышает выносливость в облике медведя и лютого медведя на 2%, а в облике кошки – силу атаки на 2%." после 3.3.3.
xmolex вне форума   Ответить с цитированием
Старый 12.04.2010, 20:58   #6
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от xmolex Посмотреть сообщение
1) Смотрел по старым, но отладку проводил под 3.3.3. Исключение срабатывало при SPELLFAMILY_GENERIC.
2) Тогда получается, что в DUMMY у нас просто так заворачивается, не совсем правильно как-то. Ладно, будем в HandleShapeshiftBoosts править.
Не работает "Также повышает выносливость в облике медведя и лютого медведя на 2%, а в облике кошки – силу атаки на 2%." после 3.3.3.
1) Хм... Знать бы точно что было в старой версии и что в новой... Точнее, что именно изменилось.
А по описанию, как именно изменился спелл?
2) Думми указывает на то, что это серверный скрипт. Думми эффект может содержать сведения в себе, например, количество урона, процент чего либо, номер спелла и т.д. и т.п. И эти данные можно использовать (как это и делается в уже реализованном куске кода). Но сам по себе думми указывает именно на серверный СКРИПТ, а не стандартный обработчик (вам ведь известно, что подавляющее большинство спеллов обрабатывается стандартными обработчиками и под каждый конкретный спелл не пишется свой код; код (скрипт) в ядре пишется только для спеллов-исключенией, так вот все думми-эффекты - исключения и требуют своего отдельного кода (обработчика/скрипта))

Проверь, существуют ли в новых ДБЦ спеллы 24900 и 24899
KiriX вне форума   Ответить с цитированием
Старый 12.04.2010, 21:00   #7
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
1) Хм... Знать бы точно что было в старой версии и что в новой... Точнее, что именно изменилось.
А по описанию, как именно изменился спелл?
В старой версии работали два спелла 24899 и 24900. Теперь их нет.
xmolex вне форума   Ответить с цитированием
Старый 12.04.2010, 21:03   #8
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от xmolex Посмотреть сообщение
В старой версии работали два спелла 24899 и 24900. Теперь их нет.
Собсна, поэтому и не работает
Ищи, чем они заменены. Или всё-таки дописывать обработчик и, скорее всего, в utit.cpp

Но, вполне возможно, теперь просто используются спеллы с другими номерами...
KiriX вне форума   Ответить с цитированием
Старый 12.04.2010, 21:32   #9
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Аналогичных спеллов нет, по крайней мере парсер с wowhead.com спеллов с аналогичными эффектами не нашел.
А обработчик в unit.cpp в каком месте стоит делать?
xmolex вне форума   Ответить с цитированием
Старый 12.04.2010, 22:01   #10
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от xmolex Посмотреть сообщение
Аналогичных спеллов нет, по крайней мере парсер с wowhead.com спеллов с аналогичными эффектами не нашел.
А обработчик в unit.cpp в каком месте стоит делать?
Лучше искать непосредственно в ДБЦ. По названию например.
Где реализовать? Да я вообще так - на вскидку сказал! Тут смотреть надо внимательно что к чему, с ходу не ответить...
KiriX вне форума   Ответить с цитированием
Старый 13.04.2010, 07:00   #11
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
Лучше искать непосредственно в ДБЦ. По названию например.
Всю ночь перекапывал DBC, вообщем спеллов похоже точно нет. Правда искал не по названию, а по аттрибутам, т.к. в 3.3.3 названий похоже нет, либо pjDbcEditer.exe их не может отобразить. Оговорюсь, что сравнивал DBC 3.3.2 и 3.3.3 enGB.

Последний раз редактировалось xmolex; 13.04.2010 в 07:08.
xmolex вне форума   Ответить с цитированием
Старый 13.04.2010, 18:41   #12
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

В связи с тем, что спеллов больше нет, как тогда лучше реализовать его? Вернее где. Если реализовать в HandleShapeshiftBoosts, то код будет белой вороной среди других спеллов в HandleShapeshiftBoosts и, соответственно, в ядро всеравно не добавят. Если в EffectDummy в кейсе SPELLFAMILY_GENERIC, тоже не верно и не добавят. Так где его реализовать?
xmolex вне форума   Ответить с цитированием
Старый 14.04.2010, 19:01   #13
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Вообщем, для себя реализовал так:
Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 4e8df4f..34b8237 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -5867,7 +5867,6 @@ void Aura::HandleShapeshiftBoosts(bool apply)
     {
         case FORM_CAT:
             spellId1 = 3025;
-            HotWSpellId = 24900;
             MasterShaperSpellId = 48420;
             break;
         case FORM_TREE:
@@ -5884,13 +5883,11 @@ void Aura::HandleShapeshiftBoosts(bool apply)
         case FORM_BEAR:
             spellId1 = 1178;
             spellId2 = 21178;
-            HotWSpellId = 24899;
             MasterShaperSpellId = 48418;
             break;
         case FORM_DIREBEAR:
             spellId1 = 9635;
             spellId2 = 21178;
-            HotWSpellId = 24899;
             MasterShaperSpellId = 48418;
             break;
         case FORM_BATTLESTANCE:
@@ -6015,7 +6012,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 = m_target->GetAurasByType(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE);
                 for(Unit::AuraList::const_iterator i = mModTotalStatPct.begin(); i != mModTotalStatPct.end(); ++i)
@@ -6023,10 +6020,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;
-
-                        m_target->CastCustomSpell(m_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;
                     }
                 }
@@ -6035,6 +6048,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_PERCENTAGE);
+             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)
             m_target->RemoveAurasDueToSpell(spellId1);
         if(spellId2)
Пояснение: Спелл делится на три части - Повышает интеллект, повышает выносливость, если в формах медведя и повышает силу атаки, если в форме кошки. Интеллект у нас и так нормально повышается, т.к. эффект у спелла Apply Aura: Mod Total Stat % (Интеллект). А вот остальные две части реализовались за счет спеллов 24900 и 24899. Сейчас их нет. Я решил поискать аналогичные и нашел: для силы атаки - Убойная сила, а для выносливости - Остаться в живых. Спеллы - таланты роги и охотника, а значит не будут конфликтовать с другими аурами друида. Вообщем, патч талант полностью реализует. Проверил лично. Я понимаю, что это хаковая реализация и принят не будет, но никаких решений я в интернете не встретил, поэтому решил выложить, вдруг кому пригодится.
Если кто-то всеже порекомендует, где реализовать обработку, чтобы патч могли принять, буду благодарен.
xmolex вне форума   Ответить с цитированием
Старый 14.04.2010, 20:10   #14
Feel the Power
Пользователь
 
Аватар для Feel the Power
 
Регистрация: 07.03.2010
Адрес: Беларусь, Минск
Сообщений: 58
Сказал(а) спасибо: 92
Поблагодарили 40 раз(а) в 17 сообщениях
Feel the Power Скоро придёт к известности
Отправить сообщение для Feel the Power с помощью ICQ
По умолчанию

Цитата:
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;}
Подобную штуку можно заменить на:
Код:
switch (HotWMod)
{
case 2: HotWSpellId = 19255; break;
case 4: HotWSpellId = 19256; break;
case 6: HotWSpellId = 19257; break;
case 8: HotWSpellId = 19258; break;
case 10: HotWSpellId = 19259; break;
}
и т.д.
Feel the Power вне форума   Ответить с цитированием
Старый 14.04.2010, 20:22   #15
xmolex
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 79
Сказал(а) спасибо: 3
Поблагодарили 10 раз(а) в 8 сообщениях
xmolex На верном пути
По умолчанию

Можно, но насколько мне известно case работает медленнее, чем if else, а раз это всеравно хаковая реализация, пусть будет быстрее.
xmolex вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[patch/dev] Heart of the Phoenix (Сердце Феникса) Insider42 Патчи 2 26.04.2013 13:50
[patch/dev]Heart of the Wild virusav Патчи 21 18.07.2010 22:21
[patch] Реализация бонуса к Death Coil от Sigil of the Vengeful Heart Warlord123 Патчи на рассмотрении 0 15.03.2010 14:01
[9523] Stacking Auras from dual wild weapons. newsbot CMaNGOS Commits 0 06.03.2010 13:11


Текущее время: 04:31. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot