Вернуться   D3Scene.Ru Софт портал игр | Хаки | Проги | Статьи > World Of Warcraft > Флейм и Обсуждение WoW > WoW Серверная
Присоединяйся к нам

WoW Серверная Хочешь поднять свой сервер? Mangos, ArcEmu, TrinityCore и другие эмуляторы.



Ответ
 
Опции темы Опции просмотра
Старый 13.05.2011, 17:48   #1
Старожил

 
Аватар для Regaska
 
Регистрация: 15.02.2009
Адрес: Гражданка - мёд!
Сообщений: 784
Репутация: 292
Отправить сообщение для Regaska с помощью ICQ Отправить сообщение для Regaska с помощью Skype™
Автор По умолчанию

[TrinityCore]FaQ По переводу патчей под новые ревизии


Вот решил написать небольшой FAQ по переводу патчей под новые ревизии.
Пример будет рассмотрен для сборки с помощью Microsoft Visual Studio 2005 (необходима сама программа и полностью скаченные исходники Trinity-Mangos подойдут любые) Вот возьмём к примеру несложный патч, правит обилки Rip и Rupture (оригинал):





Код:
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);

**Обращаем внимание только на строки, начинающиеся со знака "+" или "-", либо соседние** и удаляем ту строку, около которой в самом патче был знак "-" (в самом файле естественно не будет знака "-" и его пытаться искать в файле ненужно - просто отбрасываем его). То есть

Код:
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)));


**При переписке патчей нужно очень много использовать CTRL+C и CTRL+V что ускорит процесс. И ОБЯЗАТЕЛЬНО УДАЛЯЕМ ЗНАК "+" В НАЧАЛЕ КАЖДОЙ СТРОКИ ПОСЛЕ КОПИРОВАНИЯ В ФАЙЛ**
После этой замены получается вот такое



Код:
     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, ищем в самом патче строку


Код:
Index: src/game/Unit.cpp

и смотрим ниже строки, где в начале присутвуют + и -.
Найдя строки




Код:
-        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))); 
 +  }
Затем удаляем все "+" вначале добавленных строк.
Так же жмём сохранить.
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.

Автор XkillerX
  Ответить с цитированием Наверх
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

Быстрый переход


Powered by vBulletin
Copyright © 2017 vBulletin Solutions, Inc.
Перевод: zCarot | Дизайн: G-A | Верстка: OldEr
Текущее время: 04:48. Часовой пояс GMT +4.