Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.03.2010, 04:37   #1
Max
Гость
 
Сообщений: n/a
По умолчанию Перевод патчей под новые ревизии.

Все изменения провожу в Notepad++. (необходимы полностью скаченные исходники Mangos'a)

Возьмем, к примеру, часть патча добавляющая auctionhousebot. В котором, у меня, возникает ошибка.
Пример: 01.patch


У меня ошибка была в этом блоке патча, ошибка в файле mail.cpp. Это обычно показано в начале одного из блоков патча.(я выделил фиолетовым)


1. Собственно нужно убедится что есть сами исходники, программа Git и сам патч (желательно ещё и присутствие программы Compare IT! или других аналогичных)
2. Закидываем патч в корневую папку с исходниками, если патч для ядра. Кликаем правой кнопкой мыши по папке с исходниками и выбираем Git Bash Here. И в консоли вводим patch -p1 < имя_патча.patch, нажимаем Enter
3. Смотрим что у нас получилось, если в строчках присутствует FAILED или *** значит в патче есть ошибки. Git лучше оставить открытым, чтобы можно было найти ошибки.
4. Открываем патч который пропатчился с ошибками, и на основе лога ищем в нём блок который пропатчился с ошибкой. Делаем это основываясь на номере строчки или название файла которая/ый пропатчилась/ся с ошибкой.

Я ориентируюсь на основе:
(Старайтесь при возможность ориентироваться не только по одной строчке, т.к. они повторяются.)

Код:
// will delete item or place to receiver mail list
Если таких строчек много, тогда ориентируемся по предыдущим строчкам.

Теперь ищем строчку со знаком -, в патче, которую Git должен удалить или заменить. В моём случае это строчка:

Код:
-    SendMailTo(MailReceiver(receiver,receiver_guid), MailSender(MAIL_NORMAL, sender_guid), MAIL_CHECK_MASK_RETURNED, deliver_delay);
5. Заходим в папку с исходниками, заходим в папку "src/game/", находим файл на который ссылалась ошибка, и открываем с помощью Visual Studio или блокнота файл, на который Git сослался с ошибкой. У меня в примере Git сослался на файл - Mail.cpp
6. Открыв файл Mail.cpp нажимаем CTRL+F, в появившемся окне поиска вводим строчку которая до знака минуса, или предыдущую. (Тоесть, мы ищем ориентировочную строчку)

К примеру, у меня вместо заменяемой строчки стоит следующее:

Код:
    Player *receiver = sObjectMgr.GetPlayer(MAKE_NEW_GUID(receiver_guid, 0, HIGHGUID_PLAYER));
Если вы уверены, в том, что, строчка которую вы нашли, должна стоять вместо строчки из патча со знаком минуса в начале. Тогда копируйте эту строчку из файл, вместо строчки со знаком "минус", не забудьте поставить его в начале.
Пример того что должно получиться: 02.patch

Жмём сохранить.

7. В заключении ещё одна важная вещь. Адрес изменения. На отдельном примере
Обратите внимание на цифры в адресе изменения. @@ -1168,10 +1168,10 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES]
-1168 Обозначает номер ориентировочной строчки кода. По которой Git, будет искать, и удалять не нужные строки при необходимости. 10 Это сумма, которая определяет: кол-во ориентировочных строчек в нужном файле для Git + кол-во удаляемых строчек.
+1168 Обозначает номер ориентировочной строчки кода. По которой Git, будет искать и добавлять и или изменять нужные строчки при необходимости. 10 Это сумма, которая определяет: кол-во ориентировочных строчек в нужном файле для Git + кол-во добавляемых строчек.
OpcodeHandler opcodeTable[NUM_MSG_TYPES] Название блока в исходнике, в котором происходит изменение.
Пример: 03.patch


8. Запускаем консоль Git, как мы делали во 2 пункте, и применяем патч, лучше это делать на чистых исходниках. Если не получилось, делаем по новой.

Альтернативный способ.

Все изменения провожу в Notepad++. (необходимы полностью скаченные исходники Mangos'a)
В этом способе мы подгоняем подгоняем патч под имеющиеся исходники.

Исходный кусок кода патча для примера:


1. Собственно нужно убедится что есть сами исходники, программа Git и сам патч (желательно ещё и присутствие программы Compare IT! или других аналогичных)
2. Закидываем патч в корневую папку с исходниками, если патч для ядра. Кликаем правой кнопкой мыши по папке с исходниками и выбираем Git Bash Here. И в консоли вводим patch -p1 < имя_патча.patch, нажимаем Enter
3. Смотрим что у нас получилось, если в строчках присутствует FAILED или *** значит в патче есть ошибки. Git лучше оставить открытым, чтобы можно было найти ошибки.
4. Открываем патч. Ищем на основе результата применения патча в Git'e ищём нужный блок в котором была ошибка.
В моём примере. Начало блока вносимых изменений из патча в нужный файл исходного кода, это : diff --git a/src/game/Group.h b/src/game/Group.h
В моём примере. Конец блока вносимых изменений из патча в исходный файл нужного кода, это : #define GROUP_UPDATE_FLAGS_COUNT 20
В моём примере. Начало следующего блока вносимых изменений из патча в нужный файл исходного кода, это : diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp

5. Открываем файл, в моём примере это Group.h, и ищем строчку из патча начинающуюся со знака "-". И заменяем эти строчки на строчки которые начинаются со знака +
6. После того как вы внесли все изменения из ошибочного блока патча, удалите этот блок из патча. И продолжите дальше исправление ошибок.
Аккуратно изменяйте патч, при удалении не задевайте другие блоки.
После всех необходимых попробуйте добавить патч на чистые исходники.

P.S. Возможны краши после подгонки патчей.


Взял с rumangos.ru, а они похоже у вас. Отредактировал под Git, поправьте пожалуйста если есть ошибки. . .
Дополнил.

Последний раз редактировалось Max; 12.03.2010 в 17:21.
  Ответить с цитированием
Пользователь сказал cпасибо:
Kolorado (01.10.2013)
Старый 11.03.2010, 18:03   #2
Max
Гость
 
Сообщений: n/a
Восклицание Альтернативный способ

Альтернативный способ.


Получилось добавить его в первый пост.

Последний раз редактировалось Max; 12.03.2010 в 17:22.
  Ответить с цитированием
Старый 13.03.2010, 14:28   #3
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Чаще всего достаточно совершить меньше действий.
Накатываем патч, получаем (местами) reject
Не закрываем git - идём в папку пропатченных исходников и ищем файл, в котором мы словили reject.
Например, reject выпал на player.cpp. Находим два файла: player.cpp и player.cpp.rej. Открываем оба и сразу. Файл с расширением .rej содержит только ту часть кода патча, которую git не смог сам определить куда будет правильно подставить. Далее как в мануале. Только мы всегда работаем не с целиковым файлом патча, а лишь с теми, где возник редж и лишь с той его частью, которую не смог применить git автоматически.

Обновление патчей: накатили, поправили реджы, выполнили команду git diff > путь/имя_файла_патча.patch - всё готово.
Но это уже больше к командам гита относится, а не переводу патча под новые ревы...
KiriX вне форума   Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
Kolorado (01.10.2013)
Старый 01.04.2010, 15:41   #4
lovepsone
Ученый
 
Регистрация: 07.03.2010
Адрес: Беларусь,Брест
Сообщений: 188
Сказал(а) спасибо: 131
Поблагодарили 34 раз(а) в 27 сообщениях
lovepsone Хрен знает что...lovepsone Хрен знает что...
По умолчанию

может этот мануал тож комуто пригодится
Исправления конфликтов
Берем патч (я показываю на патче venciles ) патчим исходники командой:
Цитата:
patch –p1 < имя патча
Смотрим где у нас произошли конфликты .Он произошел в файле ConfusedMovementGenerator.cpp. Идем в папку src/game/ и открываем файл ConfusedMovementGenerator.cpp.rej. У меня там написано
Цитата:
**************
*** 102,108 ****
if(!&unit)
return true;

- if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;

if( i_nextMoveTime.Passed() )
--- 102,108 ----
if(!&unit)
return true;

+ if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED | UNIT_STAT_ON_VEHICLE))
return true;

if( i_nextMoveTime.Passed() )
Открываем файл ConfusedMovementGenerator.cpp и ищем строку
Цитата:
if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;
либо
Цитата:
if( i_nextMoveTime.Passed()
Теперь ручками заменяем строки в данном случай меняем строку
Цитата:
if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;
на
Цитата:
if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED | UNIT_STAT_ON_VEHICLE))
return true;
вот и все



Автор: MangMan

Последний раз редактировалось tempura; 03.04.2010 в 00:48.
lovepsone вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Kolorado (01.10.2013)
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура раздела патчей virusav Патчи 8 27.09.2010 15:20
Новые арены Limpnau Баг-репорты 3 16.03.2010 18:43
Шанс по рассмотрению патчей Vladimir Патчи на рассмотрении 3 08.03.2010 18:46


Текущее время: 11:31. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot