|
|
Модератор форума: staford11 |
Форум CMaNGOS Установка / Настройка CMaNGOS [Manual]Разбор кода Спелов |
[Manual]Разбор кода Спелов |
Для Новичков(от новичка) Тех Кто Хочет Чему то научиться разбираться в коде спелов и тп
Данное пособие Лишь должно натолкнуть вас на суть Что? Где? Когда? по спеллам Я думаю все понятно что наличие исходников обязательно ------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------- Перед Тем как мы начнем Обговорим особенности спелов (то что я заметил) Обычно сам спелл вызывает так называемые эффекты которые тоже могут вызывать другие эффекты тоесть при использовании 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) Дальше Определяемся Какой Спелл мы хотим Разобрать Узнаем его номер например на wowhead Сразу Уточню что не всегда просто найти в коде место где именно обрабатываться спелл Я попробую разобрать несколько спеллов 1)Возьмем Достаточно Сложный С виду Спелл Demonic Sacrifice (не удачный Пример но все же ) http://www.wowhead.com/?spell=18788 Я думаю по этой строчке очевидно что ид спелла 18788 Открываем Смотрим Снизу в описании (Spell Details) Effect- Instakill (Хм что же это значит ) Далее запускаем программу spell_work (уточню Программа должна находиться в папке с сервером ну или рядом с dbc файлами) в Option Подключаем его к вашей базе данных(вроде не обязательно) Номер Спелла (как узнать ? выделен выше красным) вставляем справа в программе в поле Search Нажимаем на кнопку Поиск Чуть ниже в табличке высвечивается найденный Спелл и в скобках его название (Уточнение:Если dbc файлы вынуты из русского клиента название не ВЫСВЕЧИВАЕТСЯ ) Клацаем в табличке на спелл Слева В большом пустом поле появляется информация (оговорю как найти в коде что либо. Открываем папку с исходниками нашм случаем надо искать в папке game нажимаем на этой папке Поиск. в Сточку Искать Текст вставляем то что нам надо найти в коде) Что мы Здесь видим SPELLFAMILY_GENERIC (Так называемое Семейство Спелла) описание в enum SpellFamilyNames в SpellMgr.h SPELL_SCHOOL_SHADOW (Тип Магии ) описание в enum SpellSchools в SharedDefines.h SPELL_DAMAGE_CLASS_NONE(Тип повреждения магии ) все что выше нас мало интересует идем дальше
Code 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 в котором происходит обработка вот еще мини разбор неправильно работающего спелла Code http://www.wowhead.com/?spell=53007 иногда просто пропадает.То есть нацелился на кого-то и жмёшь на скил и самого эффекта нет.Такое примерно в 25% случаев Береш выбираешь себя потом нажимаешь кастовать спелл указатель предлагает выбрать цель выбираешь получаешь в себя демаг
Code if (m_caster->IsFriendlyTo(unitTarget)) //Если выбранная цель кастующего(но не цель каста заклинания ) дружественная то m_caster->CastSpell(unitTarget, heal, true, 0); // кастуеться спелл на выбранную цель где heal это спелл лечения указанный чуть выше этого кода else // иначе m_caster->CastSpell(unitTarget, hurt, true, 0); // кастуеться спелл на выбранную цель где hurtэто спелл дмг указанный чуть выше этого кода Взято с Mangos.ru
Сообщение # 1 написано 14.05.2009 в 15:54
|
ВО первых информация взята не полностью
Не осилил скопировать все информативные посты? а во вторых если что то и копипастишь хоть бы автора указал Накой держать такой мануал на сайте если даже ссылки на тему на мангосе с спелл ворком потер?
Сообщение # 2 написано 16.05.2009 в 03:49
|
Quote (partizanes) ВО первых информация взята не полностью Не осилил скопировать все информативные посты? а во вторых если что то и копипастишь хоть бы автора указал Накой держать такой мануал на сайте если даже ссылки на тему на мангосе с спелл ворком потер? Cходи в макдоналдс чем писать такую чушь... Marlock спс тебе оч полезно но ссылки на спел ворк можно б и выложить
Сообщение # 3 написано 16.05.2009 в 08:38
|
отвратительные пояснения в коде
Code if( !unitTarget || !unitTarget->isAlive() ) //Если Цель зклинания живая TARGET_PET если кто забыл return; // возвращает значение // Если есть цель или цель не живая. /* дальше переводить даже не хочу, сплошной копипласт */ |
| |||
| |||