Ru-MaNGOS

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

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

Прочая документация Помощь, книги, инструкции, описания

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2010, 17:19   #1
partizanes
Пользователь
 
Аватар для partizanes
 
Регистрация: 15.03.2010
Адрес: Беларусь,Витебск
Сообщений: 93
Сказал(а) спасибо: 97
Поблагодарили 36 раз(а) в 11 сообщениях
partizanes На верном пути
Отправить сообщение для partizanes с помощью ICQ Отправить сообщение для partizanes с помощью Skype™
По умолчанию

Для Новичков(от новичка) Тех Кто Хочет Чему то научиться разбираться в коде спелов и тп
Данное пособие Лишь должно натолкнуть вас на суть Что? Где? Когда? по спеллам
Я думаю все понятно что наличие исходников обязательно

-------------
Перед Тем как мы начнем Обговорим особенности спелов
(то что я заметил)

Обычно сам спелл вызывает так называемые эффекты, которые тоже могут вызывать другие эффекты то есть при использовании 1 спелла мы на самом деле используем их несколько
Как я понял у одного спелла может быть до 3 Эффектов
(Но у каждого из этих трех эффектов может быть еще до 3 эффектов )
Очень хороший пример
http://www.wowhead.com/?spell=55342
рассмотрим Spell Details
Apply Aura: Mod Total Threat (Fade) -- Накладывает на игрока ауру
Apply Aura: ?? (Aura #226) --Накладывает на игрока ауру
Trigger Spell Mirror Image -- Вызывает Другой спелл http://www.wowhead.com/?spell=58832
который уже в свою очередь вызывает еще 3 спелла
http://www.wowhead.com/?spell=58833
http://www.wowhead.com/?spell=58831
http://www.wowhead.com/?spell=58834
вот каждый из них вызывает по так называемой иллюзии Effect Summon (31216) Radius: 3 yards
(это очень сложный спелл который пока не реализован из-за плохо реализованной системы суммонов) (да и наверно на данный момент из за отсутствия реализации ауры(эффекта) -копирования внешнего вида )

-------------
Итак Начнем:
Первое что нам понадобиться это программа от Chestr называться она spell_work скачиваем под нужную версию (3.0.8 подходит для 3.0.9)

На данный момент 13.09.10г -актуальнее будет
http://ru-mangos.ru/showthread.php?t=765
Дальше Определяемся Какой Спелл мы хотим Разобрать Узнаем его номер например на wowhead
Сразу Уточню что не всегда просто найти в коде место где именно обрабатываться спелл


Возьмем Достаточно Сложный С виду Спелл Demonic Sacrifice
(не удачный Пример но все же )
http://www.wowhead.com/?spell=18788 Я думаю по этой строчке очевидно что ид спелла 18788
Открываем Смотрим Снизу в описании (Spell Details)
Effect- Instakill (Хм что же это значит )
Далее запускаем программу spell_work
(уточню Программа должна находиться в папке с сервером ну или рядом с dbc файлами)
в Option Подключаем его к вашей базе данных(вроде не обязательно)
Номер Спелла (как узнать ? выделен выше красным) вставляем справа в программе в поле Search
Нажимаем на кнопку Поиск
Чуть ниже в табличке высвечивается найденный Спелл и в скобках его название
(Уточнение:Если dbc файлы вынуты из русского клиента название не ВЫСВЕЧИВАЕТСЯ,в программе SpellWork на C#. все нормально )
Клацаем в табличке на спелл
Слева В большом пустом поле появляется информация
(оговорю как найти в коде что либо. Открываем папку с исходниками в нашем случаем надо искать в папке game нажимаем на этой папке Поиск. в Строчку Искать Текст вставляем то что нам надо найти в коде)
Что мы Здесь видим
SPELLFAMILY_GENERIC (Так называемое Семейство Спелла)
описание в enum SpellFamilyNames в SpellMgr.h
SPELL_SCHOOL_SHADOW (Тип Магии )
описание в enum SpellSchools в SharedDefines.h
SPELL_DAMAGE_CLASS_NONE(Тип повреждения магии )

все что выше нас мало интересует идем дальше
Target A (TARGET_PET) - цель на которую будет применяться заклинание
Effect: (001) SPELL_EFFECT_INSTAKILL -эффект который будет наложен
Топаем в поиск и ищем в исходниках(Game) SPELL_EFFECT_INSTAKILL (чуть выше было уточнено как это делать)
У меня нашло три файла Creature.cpp SharedDefines.h SpellEffects.cpp
Включаем Логику SPELL_EFFECT_INSTAKILL лезем в SpellEffects.cpp
И производим по тексту Поиск слова INSTAKILL
нашли ?
О теперь видим // Demonic Sacrifice
Что же тут написано?

Код:
void Spell::EffectInstaKill(uint32 /*i*/)
{
     if( !unitTarget || !unitTarget->isAlive() )                         //Если Цель зклинания живая TARGET_PET если кто забыл
         return;                    // возвращает значение  

     // Demonic Sacrifice                    
     if(m_spellInfo->Id==18788 && unitTarget->GetTypeId()==TYPEID_UNIT)  
                    //если Ид спелла = 18788 и цель TYPEID_UNIT(вероятно моб)  
     {                    //если выше оба верны то выполняется то что ниже (что оба верны должны быть указывает это знач && )
         uint32 entry = unitTarget->GetEntry();   
//обьявляется переменнная entry  которой присваиваться номер(entry цели игрока)  
         uint32 spellID;                    ///Объявляется переменная  spellID
         switch(entry)                    //То что в скобках сравнивается с  значениями  case XXX
         {
             case   416: spellID=18789; break;               //imp                          //eсли entry = 416 то spellID=18789 (416 ентри моба 18789  спелл который будет вешаться на игрока)
             case   417: spellID=18792; break;               //fellhunter                //тоже самое только ид разное
             case  1860: spellID=18790; break;               //void                       //тоже самое только ид разное
             case  1863: spellID=18791; break;               //succubus               //тоже самое только ид разное
             case 17252: spellID=35701; break;               //fellguard              //тоже самое только ид разное
             default:                   \\если не нашло значения  
}  
                 sLog.outError("EffectInstaKill: Unhandled creature entry (%u) case.",entry);
                    //Вывести сообщение в консоль неизвестный номер моба
                 return;                 
m_caster->CastSpell(m_caster,spellID,true);      
                    //кастующий - кастует спелл на себя с присвоенным  spellID ранее
     }

     if(m_caster==unitTarget)                    // prevent interrupt message
если оба оба операнта равны (кастер=цели)  
         finish();                    //закончить ? (точно не знаю) не выполнять что дальше?

     m_caster->DealDamage(unitTarget, unitTarget->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
         }
                    //Кастер наносит (цели повреждение = ее хп ) -- тоесть происходит убийство питомца
вывод: при касте заклинания с 18788 вызывается Эффект Instakill в котором происходит обработка
значений и кастуеться спелл на игрока в зависимости от суммона и происходит убийство суммона




вот еще мини разбор неправильно работающего спелла
Цитата:
http://www.wowhead.com/?spell=53007 иногда просто пропадает.То есть нацелился на кого-то и жмёшь на скил и самого эффекта нет.Такое примерно в 25% случаев
Береш выбираешь себя потом нажимаешь кастовать спелл указатель предлагает выбрать цель выбираешь получаешь в себя демаг
Все потому что в коде с этим спелом проверка идет на выбраную цель а не на цель на которую кастуеться спелл попытался разобраться не получилось
Причем паловский похожий скил работает как надо только потому что может кастоваться на себя
и там такая же реализация
кому интересно вот кусочек кода 53007 (для новичков напишу коменты )
Цитата:
if (m_caster->IsFriendlyTo(unitTarget)) //Если выбранная цель кастующего(но не цель каста заклинания ) дружественная то
m_caster->CastSpell(unitTarget, heal, true, 0); // кастуеться спелл на выбранную цель где heal это спелл лечения указанный чуть выше этого кода
else // иначе
m_caster->CastSpell(unitTarget, hurt, true, 0); // кастуеться спелл на выбранную цель где hurtэто спелл дмг указанный чуть выше этого кода
Если вы осилили данную статью - то самое время перейти на ознакомление с отладкой ^^
http://ru-mangos.ru/showthread.php?goto=newpost&t=2356

Последний раз редактировалось partizanes; 13.09.2010 в 17:19. Причина: Привел в первоначальный вид
partizanes вне форума   Ответить с цитированием
13 пользователя(ей) сказали cпасибо:
fedr (09.05.2010), FreeBSD (30.08.2010), Konctantin (12.03.2010), Lightunit (13.03.2010), MaxXx2021 (13.03.2010), sven (29.03.2010), Wish (13.03.2010)
Старый 13.03.2010, 05:32   #2
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Спасиб очень подробно. Если такой мануал был когда я учился. Все бы быстрей было! Но если сможешь добавь в каких CPP файлах надо работать чтоб написать спелл! И в каком что писать. Такой информации бы не было цены.
MaxXx2021 вне форума   Ответить с цитированием
Старый 13.03.2010, 18:47   #3
Feel the Power
Пользователь
 
Аватар для Feel the Power
 
Регистрация: 07.03.2010
Адрес: Беларусь, Минск
Сообщений: 58
Сказал(а) спасибо: 92
Поблагодарили 40 раз(а) в 17 сообщениях
Feel the Power Скоро придёт к известности
Отправить сообщение для Feel the Power с помощью ICQ
По умолчанию

Цитата:
Сообщение от MaxXx2021 Посмотреть сообщение
Но если сможешь добавь в каких CPP файлах надо работать чтоб написать спелл!
1. Это не автор статьи.
2. На сколько я знаю, "сделать" новое заклинание нельзя, можно только изменить имеющееся.
Feel the Power вне форума   Ответить с цитированием
Старый 27.03.2010, 20:06   #4
Immortal
Новичок
 
Регистрация: 09.03.2010
Сообщений: 10
Сказал(а) спасибо: 1
Поблагодарили 1 раз в 1 сообщении
Immortal На верном пути
По умолчанию

Цитата:
Сообщение от Feel the Power Посмотреть сообщение
1. Это не автор статьи.
2. На сколько я знаю, "сделать" новое заклинание нельзя, можно только изменить имеющееся.
сделать можно, у нас человек из команды занимается этим, да только
там возни много очень
можно и стандартные заклинания поменять. думаю найдется немало малонужных спеллов.
Immortal вне форума   Ответить с цитированием
Старый 28.03.2010, 23:30   #5
Anti
Пользователь
 
Аватар для Anti
 
Регистрация: 12.03.2010
Адрес: Беларусь
Сообщений: 54
Сказал(а) спасибо: 8
Поблагодарили 24 раз(а) в 17 сообщениях
Записей в дневнике: 1
Anti На верном пути
Отправить сообщение для Anti с помощью ICQ Отправить сообщение для Anti с помощью Skype™
По умолчанию

Как сказал 1 умный человек: "лучший способ разобраться в спелах - дебаг".
Anti вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
MaS0n (29.03.2010)
Старый 29.03.2010, 06:15   #6
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

MaS0n вне форума   Ответить с цитированием
Старый 29.08.2010, 05:13   #7
partizanes
Пользователь
 
Аватар для partizanes
 
Регистрация: 15.03.2010
Адрес: Беларусь,Витебск
Сообщений: 93
Сказал(а) спасибо: 97
Поблагодарили 36 раз(а) в 11 сообщениях
partizanes На верном пути
Отправить сообщение для partizanes с помощью ICQ Отправить сообщение для partizanes с помощью Skype™
По умолчанию

кхм..очень интересная ,но увы забытая тема ((

я вот в поиске информации на форуме натолкнулся на эту тему ...самое интересное что опять Mirror_Image ....
что 12.03 я не знал с какой стороны к нему подходить,и сейчас не знаю и так и так, а он все равно не работает)))

з.ы Обновил первый пост ^^
__________________
Когда-нибудь на оффе поставят Mangos...

Последний раз редактировалось partizanes; 13.09.2010 в 17:21.
partizanes вне форума   Ответить с цитированием
Старый 24.01.2012, 15:29   #8
lovepsone
Ученый
 
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
lovepsone Хрен знает что...lovepsone Хрен знает что...
По умолчанию

Тема очень полезная для тех кто более-мение начал осваивать с++, но хотелось бы ее обновить, так как она еще со старого форума. А я пойду разбирать код мангоса, это очень интересно, хотя еще много чего не понимаю, самому тяжело учить язык!
__________________
sql-language.ru
lovepsone вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор пакетов WoW DeusModus Прочая документация 29 25.09.2014 19:58
Стандарты написания кода в патчах virusav Прочая документация 15 23.12.2010 09:40
Синхронность спелов и анимации selector Баг-репорты 3 09.11.2010 05:03
Создание спелов antigm Корзина 8 15.08.2010 12:43
Редактирование кода Klark Корзина 8 31.05.2010 10:39


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


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