Главная Форум Файлы
Вы находитесь: Wow World Game » FAQ По переводу патчей под новые ревизии - wow-portal-Форум
  • Страница 1 из 1
  • 1
Модератор форума: zevs  
FAQ По переводу патчей под новые ревизии
attleДата: Четверг, 01.09.2011, 18:58 | Сообщение # 1

Сообщений: 63
Награды: 1
Репутация: 156
Вот решил написать небольшой 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
 
  • Страница 1 из 1
  • 1
Поиск: