attle | Дата: Четверг, 01.09.2011, 18:58 | Сообщение # 1 |
Сообщений: 63
| Вот решил написать небольшой FAQ по переводу патчей под новые ревизии. Пример будет рассмотрен для сборки с помощью Microsoft Visual Studio 2005 (необходима сама программа и полностью скаченные исходники Trinity-Mangos подойдут любые) Вот возьмём к примеру несложный патч, правит обилки Rip и Rupture (оригинал): Code
Index: src/game/SharedDefines.h =================================================================== --- src/game/SharedDefines.h (revision 3207) +++ src/game/SharedDefines.h (working copy) @@ -1016,5 +1016,7 @@ #define UNIT_FLAG_ANIMATION_FROZEN 0x0400 #define UNIT_FLAG_WAR_PLAYER 0x1000 -#define SPELL_ID_AGGRO 22764 +#define SPELL_ID_AGGRO 22764 +#define SPELL_ICONID_RIP 108 +#define SPELL_ICONID_RUPTURE 500 #endif Index: src/game/SpellAuras.cpp =================================================================== --- src/game/SpellAuras.cpp (revision 3207) +++ src/game/SpellAuras.cpp (working copy) @@ -240,7 +240,8 @@ if(caster->GetTypeId() == TYPEID_PLAYER) { comboPoints = (uint8)((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & 0xFF00) >> 8); - caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); + if (!(spellproto->EffectPointsPerComboPoint[0] > 0 && (spellproto->SpellIconID == SPELL_ICONID_RIP || spellproto->SpellIconID == SPELL_ICONID_RUPTURE ))) + caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); } comboPoints = comboPoints < 5 ? comboPoints : 5; m_duration += int32((maxduration - m_duration) * comboPoints / 5); @@ -264,6 +265,8 @@ { m_caster_guid = caster->GetGUID(); damage = CalculateDamage(); + if ((spellproto->EffectPointsPerComboPoint[0] > 0 && (spellproto->SpellIconID == SPELL_ICONID_RIP || spellproto->SpellIconID == SPELL_ICONID_RUPTURE ))) + caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); } m_effIndex = eff; Index: src/game/Unit.cpp =================================================================== --- src/game/Unit.cpp (revision 3207) +++ src/game/Unit.cpp (working copy) @@ -4602,8 +4602,11 @@ if(comboDamage > 0) { value += (int32)(comboDamage * comboPoints); - if(GetTypeId() == TYPEID_PLAYER) - SetUInt32Value(PLAYER_FIELD_BYTES,((GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); + if(GetTypeId() == TYPEID_PLAYER) + { + if (!(spellProto->EffectPointsPerComboPoint[0] > 0 && (spellProto->SpellIconID == SPELL_ICONID_RIP || spellProto->SpellIconID == SPELL_ICONID_RUPTURE ))) + SetUInt32Value(PLAYER_FIELD_BYTES,((GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); + } } return value;
СПОСОБ 1 (Дешёвый, но долгий):
Разберём всё по шагам. 1) Собственно нужно убедится что есть сами исходники, программа Tortoise SVN, сам патч и Visual Studio (желательно ещё и присутствие программы Compare IT! или других аналогичных) 2) Выделяем файл патча (расширение *.patch), вызываем контекстное меню, жмём "TortoiseSVN" => "Apply Patch". Там указываем папку с исходниками, нажимаем "ОК". Тут же появляется окно "TortoiseMerge", в нём в левой части список файлов различных расширений (в нашем случае : SharedDefines.h, SpellAuras.cpp, Unit.cpp). Выделяем любой из них, вызываем контекстное меню и жмём "Patch All", при этом файлы, которые были выделены красным цветом выдадут нам ошибку - жмём ок. 2) Запомнив названия файлов, которые были красным цветом открываем файл пачта (файл расширения *.patch открываем любым текстовым редактором) 3) Заходим в папку с исходниками, ищем папки "src" => "game", и там открываем с помощью Visual Studio один из файлов, которые были выделены красным цветом в "TortoiseMerge" (К примеру, когда мы ставили патч через TortoiseMerge, красным цветом было выделено только 2 файла из трёх - Unit.cpp и Spellauras.cpp) 4) Открыв файл Spellauras.cpp нажимаем CTRL+F, в появившемся окне поиска вводим (это соседняя строка от изменяемного места. Так же можно искать по удаляемому коду (это строка, вначале которой стоит знак "-") Code
comboPoints = (uint8)((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & 0xFF00) >> 8);
**Обращаем внимание только на строки, начинающиеся со знака "+" или "-", либо соседние** и удаляем ту строку, около которой в самом патче был знак "-" (в самом файле естественно не будет знака "-" и его пытаться искать в файле ненужно - просто отбрасываем его). То есть
[code]caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8)));
и на её место вставляем (так же нужно правельно сдвигать строки! Не лепить куски нового кода в ту же строку)
Code
+ if (!(spellproto->EffectPointsPerComboPoint[0] > 0 && (spellproto->SpellIconID == SPELL_ICONID_RIP || spellproto->SpellIconID == SPELL_ICONID_RUPTURE ))) + caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8)));
**При переписке патчей нужно очень много использовать CTRL+C и CTRL+V что ускорит процесс. И ОБЯЗАТЕЛЬНО УДАЛЯЕМ ЗНАК "+" В НАЧАЛЕ КАЖДОЙ СТРОКИ ПОСЛЕ КОПИРОВАНИЯ В ФАЙЛ** После этой замены получается вот такое
Code
if( m_duration != maxduration ) { uint8 comboPoints=0; if (caster && caster->GetTypeId() == TYPEID_PLAYER) { comboPoints = (uint8)((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & 0xFF00) >> 8); if (!(spellproto->EffectPointsPerComboPoint[0] > 0 && (spellproto->SpellIconID == SPELL_ICONID_RIP || spellproto->SpellIconID == SPELL_ICONID_RUPTURE ))) caster->SetUInt32Value(PLAYER_FIELD_BYTES,((caster->GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); } comboPoints = comboPoints < 5 ? comboPoints : 5; m_duration += int32((maxduration - m_duration) * comboPoints / 5);
5) После внесения всех изменений, что были указаны в патче в файл, жмём кнопку Save на панели инструментов Visual Studio в редакторе и выходим. Теперь можно приступать к следующему файлу - Unit.cpp 6) Как и в предыдущий раз, открываем файл Unit.cpp, ищем в самом патче строку
Code Index: src/game/Unit.cpp
и смотрим ниже строки, где в начале присутвуют + и -. Найдя строки Code
- if(GetTypeId() == TYPEID_PLAYER) - SetUInt32Value(PLAYER_FIELD_BYTES,((GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); (Только без "-") Выделяем их полностью и заменяем на
Code
+ if(GetTypeId() == TYPEID_PLAYER) + { + if (!(spellProto->EffectPointsPerComboPoint[0] > 0 && (spellProto->SpellIconID == SPELL_ICONID_RIP || spellProto->SpellIconID == SPELL_ICONID_RUPTURE ))) + SetUInt32Value(PLAYER_FIELD_BYTES,((GetUInt32Value(PLAYER_FIELD_BYTES) & ~(0xFF << 8)) | (0x00 << 8))); + }
Затем удаляем все "+" вначале добавленных строк. Так же жмём сохранить. 7) После всего этого выходим к папке с исходниками, вызываем на ней контекстное меню, затем "TortoiseSVN"=>"Create Patch", выбираем место куда сохранить файл, пишем ему любое название и ставим расширение *.patch (пример - blizzlike.patch). Этим самым вы создадите патч под новую реву и можете смело его выкладывать, Но...Желательно его и сверить с оригиналом - не наделали вы ошибок. Для этого к примеру можно использовать программу Compare IT!. Запускаем её, появляется меню выбора первого файла - выбираем оригинал, затем выбрав первый, появляется меню выбора второго файла - выбираем наш патч. После этого перед нами предстаёт окно, разделённое на 2 половины. Ищем места где слева есть красные или тёмно-зелёные полоски (на синие полоски не обращайте внимания - это означает что изменён номер ревизии или номер строки). Найдя красную или зелёную строку нужно либо восстанавливать бэкап изменённого файла и переписывать по новой, либо найти неверные строки и поправить всё вручную (Не стоит обращать внимания на выделение строки "\ No newline at end of file" в конце файла, на работу патча это не повлияет).
СПОСОБ 2 (Быстрый, но платный): ПРЕДУПРЕЖДАЮ, ЭТОТ СПОСОБ НЕСЛАБО ЖРЁТ ИНТЕРНЕТ ТРАФФИК Решил дополнить FAQ, так как забыл указать ещё 1 отличный способ быстро и качественно переводить патчи под новые ревизии Mangos'a. Заключается он в использовании Tortoise Merge (одна из утили Tortoise SVN). Тут всё намного проще: Делаем 1 пункт первого способа, но немного иначе - при появлении окна Tortoise Merge выделяем любой из файлов в левом списке, затем вызываем контекстное меню и жмём "Patch All", затем вместо нажиманий Cancel как мы делали в первом способе просто ждём, программа сама сверит всё в интернете и подставит как надо. Когда все файлы в левом списке станут серого цвета можно закрывать окно и делать пункт 7 первого способа. Так же могут возникнуть проблемы несовместимости патча с новой ревой - Tortoise Merge выдаёт ошибку что нужно вносить изменения в файл вручную (тут есть 2 выхода: 1 - использовать первый способ перевода патча;2 - нажать на этом файле "Preview Patched File", после чего программа начнёт сверять копию с интернета и откроет файл, тут нажимаем F7, смотрим на нижнюю половину экрана и указываем там как поступить в данном случае). Затем делаем пункт 7 из 1-го способа, проверка с помощью Compare IT! не обязательна при использовании Tortoise Merge.
Сообщение отредактировал attle - Четверг, 01.09.2011, 18:59 |
|
| |