• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
FaQ По переводу патчей под новые ревизии
XkillerX
Сержант
Вот решил написать небольшой 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.
(В поиске искал такой темы нету)

Не откожусь от +сиков

Сайт: Athear
Форум: Athear/Forum
Set realmlist Athear.ru
Сообщение # 1 написано 11.04.2011 в 19:08
  • Страница 1 из 1
  • 1
Поиск: