Gf-il Downgrade information PTS

Hitcher

Последний из атеистов
Участник
Сообщения
159
Розыгрыши
0
Репутация
1
Реакции
12
Баллы
880
Здравствуйте. Хотелось бы собрать полный комплект информации по довнгрейду Gf-il. PTS
Что известно:
- Рендж выстрела из лука Gf-дальше, il-ближе.
- Gf быстрый хп реген у мобов. il-медленный.
- Battle roar совместно с blessed body есть проблема когда батлроар не хилит, если висит белс бади.
- Trait system - il(предсказуемый урон магии). Gf разброс дмага при маг атаках.
- Скрипты: Зависимость от ярлыков прописанных в сервере. Нельзя изменить базовые названия скилов, и айтемов. Можно только добавить новые, удалить стараые нельзя без хуков?
- ai nasc совершенно другая логика и все та же зависимость от названий скилов и айтемов.

Пожалуйста дополните тему своими знаниями... Есть ли различия в крит атаке, шансе или силе крита?
Есть ли различия в атаках с вампиризмом? Любые другие критически важные различия...
 
шта?
понятно что в большинстве мест ссылки на предметы/нпс/скиллы идут по их символическим именам, но почему это мешает их менять? понятно что придется и все их упоминания в других местах поправлять, но это и логично.

но не спорю что есть конечно некоторый хардкод в самих экзешниках на тему "если это предмет/умение с таким-то ид, то делаем это ..." - от него полноценно не избавились даже в свежих серверах. помнится в экзешнике хомки тоже натыкался на подобные поверки.
 
Реально птс интерлюда нету. Есть либо ц4 либо гф. Вся эта информация не более чем кем то выдуманная, не факт, что в интерлюде так было
 
Вероятно я мог недосмотреть этот момент, и нужно было удалить по всюду, включая nasc, npc data, skill data, skill patch, skill patch2, где еще areadata? есть неочевидные места, в которых сервер будет выдавть ругань, а ты ищи свищи где оно там застряло)

понимаю, но хотя бы приблизиться к какому то подобию с4 уже было бы хорошо)
 
Последнее редактирование модератором:
Как например точечно отловить корень ошибки в логах?
для наглядности имеются данные в skilldata:
effect={{p_max_hp;{all};15;per;1};{i_hp_per_max;15}}
сервер не выдает никаких ошибок.
мне захотелось, методом тыка, добавить одну цифру в конце эффекта:
effect={{p_max_hp;{all};10;per;1};{i_hp_per_max;10;1}} и знаете что произошло с сервером?
он сошел с ума и обвинил все все скилы поголовно выдав 230690 тысяч строк с дублирующимися ошибками, не имеющими никакого отношения к этому булиан значению которое я попытался присвоить в конце эффекта в скиллдате.) а корень проблемы всего лишь в одной лишней цифре.
 
Ну где-то в начале лавины этих сообщений будет к примеру стэктрейс с указанием какой эффект не удалось нормально разобрать. Правда не факт что с конкретизацией в кком конкретно скилле.
А вобще с валидацией данных в парсерах в птс вобще беда та еще - они спокойно переваривают к примеру не существующие данные наподобие задания в эффекте нпс, которого даже нет в npcdata и т.п.
 
спасибо, действительно первое важное сообщение в начале лавины указывает line:
Parsing SkillData file failed after line[1479] хотябы уже есть номер строки в которую нужно смотреть.

Первая огромная трабла при довнгрейде возникает в skilldata с effect. Нельзя просто так воткнуть копипастом эффект из с4 например, или из Gfil Advext у них там свой кастом вписан. из Интера тоже нельзя. Gf это чисто Gf и хоть кол на голове верти у них свой отдельный синтаксис с поломанной механикой всего.

Скорее всего без хуков точно не обойтись. У Vanganth есть превосходный HookManager, Emca чуть по другому методу но тоже сильно шарит в реверсе. Осталось совсем чуть чуть, разобраться в том как отлавливать адреса которые не будут съезжать после рестарта от ASLR, понять что такое виртуал протекшан, сколько именно байт менять и каких именно, когда джампить а когда и врайтить) WriteBYTE, WriteDWORD, WriteQWORD, WriteDOUBLE, понять как работает исходный код, понять как работает процессор. И все. готово.
 
Последнее редактирование модератором:
Уделите время и вы все сможете, тем-более есть пдб от свежей версии 162 протокола, куда можно подсматривать.
 
Извините, а можно узнать, что за пдб? от гф л2сервер?
 
Извините, а можно узнать, что за пдб? от гф л2сервер?
От мейна 162 протокола, лежит в в теме classic 3.0 адаптировать структуры классов под гф труда не составит. Потом перенести структуры к себе в екст и работать по человечески с норм экстом
 
PDB (Program Database) файла. PDB-файл - это файл отладочной информации, который создается компиляторами Microsoft Visual C++ (и некоторыми другими) в процессе сборки программ.
Есть большая база под Gf спасибо Osie. Он кстати начал довнгрейд еще давно, но потом перешел на Perfect World. Вот его репа там же и PDB :
 
Ну как основу можно взять экст от осие гф, навалить туда разобранных структур, стянутых из 162 и подведенных побайтово под гф, и получится в полне себе хорошая база для работы по даунгрейду до ит
 
ничесиииии ии мне написал уже штук 8 парсеров) и вот что он думает по поводу була в конце эффекта:
Спасибо за теплые слова, я рад, что могу быть полезным!

Давайте разберем данные из `skilldata.txt` и сделаем предположение о методе хука.

**Анализ данных:**

```
skill_begin skill_name=[s_battle_roar1] skill_id=121 level=1 operate_type=A2 magic_level=28 effect={{p_max_hp;{all};10;per;1};{i_hp_per_max;10;1}} is_magic=0 mp_consume2=13 cast_range=-1 effective_range=-1 skill_hit_time=1.5 skill_cool_time=0 skill_hit_cancel_time=0.5 reuse_delay=600 activate_rate=-1 lv_bonus_rate=0 basic_property=none abnormal_time=600 abnormal_lv=1 abnormal_type=max_hp_up abnormal_instant=0 attribute={attr_none;0} trait={trait_none} effect_point=268 target_type=self affect_scope=single affect_limit={0;0} next_action=none ride_state={@ride_none} multi_class=0 olympiad_use=1 skill_end
```

Разберем ключевые моменты:

* **`skill_begin` и `skill_end`**: Очевидно, что это маркеры начала и конца описания скилла.
* **`skill_name=[s_battle_roar1]`**: Название скилла.
* **`skill_id=121`**: Идентификатор скилла.
* **`effect={{p_max_hp;{all};10;per;1};{i_hp_per_max;10;1}}`**: Это самое интересное. Похоже на описание эффектов скилла. Здесь два эффекта:
* `{p_max_hp;{all};10;per;1}`: Вероятно, повышение максимального HP на 10%, действие на всех (возможно на себя, ввиду `target_type=self`).
* `{i_hp_per_max;10;1}`: Судя по `i_`, это *мгновенный эффект*, возможно, восстановления HP в процентах от максимального.
* **`1` в конце**: Это, как вы правильно заметили, Boolean. Вероятно, это флаг, указывающий, что при применении этого эффекта нужно вызвать *хук функцию*.

* **`target_type=self`**: Указывает, что скилл накладывается на себя.
* **`operate_type=A2`**: Это, скорее всего, тип операции скилла.
* **Прочие параметры:** описывают детали скилла, такие как время каста, отката, расход маны, дальность и прочее.

**Предположение о методе хука:**

Исходя из этих данных и наличия в конце `1`, что, вероятно, является булевым флагом, можно предположить, что **используется табличный метод хука с инъекцией кода**.

Вот как это может работать:

1. **Структура данных:** В ядре движка (сервере) существует таблица, в которой хранятся данные о скиллах. Эта таблица, вероятно, имеет структуру, где одна из колонок содержит список эффектов, которые нужно применить для конкретного скилла, как мы видим из `skilldata.txt`.
2. **Обработчик эффектов:** При выполнении скилла вызывается некий обработчик эффектов, который перебирает эффекты из таблицы скиллов, и на их основе вносит изменения.
3. **Хук-флаг:** В этой структуре данных присутствует специальное поле, которое соответствует значению *1* из `skilldata.txt`. Это булевское значение и указывает на необходимость вызвать хук-функцию.
4. **Инъекция кода и таблица хуков:** Где-то в движке есть таблица или другое хранилище адресов *кастомных функций-хуков*. Когда обработчик эффектов встречает значение `1` у эффекта в скиле, он понимает, что нужно вызвать такую функцию из этой таблицы. В этом месте происходит переход управления на написанную разработчиком кастомную функцию, чтобы изменить стандартное поведение.
5. **Логика хук-функции:** Хук-функция, в свою очередь, реализует кастомную логику изменения эффекта скилла (например, как именно будет реализовано восстановление HP), затем управление возвращается в оригинальный обработчик эффектов.

**Почему это табличный хук с инъекцией кода:**

* **Табличный:** Потому что обработчик эффектов обращается к некоторой структуре данных (таблице) для определения, какие эффекты применять и какие хук-функции вызывать.
* **Инъекция кода:** Использование кастомных функций подразумевает, что разработчик внедрил свой код в память процесса и создал таблицу вызовов этих функций.

**Альтернативные предположения:**

* **Inline Hook:** Также возможен вариант, что *1* это не флаг, а ID эффекта и для этого эффекта (i\_hp\_per\_max) есть отдельный обработчик с inline hook, и, в зависимости от этого ID, вызывается нужный хук. Однако, судя по тому что мы видим, такая конструкция менее вероятна, но ее тоже стоит учитывать.
* **Ветвление в коде:** Возможно, в обработчике эффектов есть ветвление, основанное на каком-то ID эффекта, которое вызывает кастомную логику, то есть без инъекции кода, а на уровне обычного if/else. Но это менее вероятно, т.к. такое решение не подходит для будущих модификаций.

**Заключение:**

Исходя из анализа данных и наличия хук-флага, самым вероятным методом для реализации этой кастомной фичи является **табличный метод хука с инъекцией кода**.
Такой метод позволяет гибко модифицировать эффекты скилов, добавляя кастомную логику через хук-функции, адреса которых хранятся в отдельной таблице.
 
Вы сначала разберите необходимые классы, такие как csharedcreaturedata, ccreature, user, csocket, cusersocket, cskillinfo и многие другие, потом разберете эффекты скиллов нужных и перепишите как вам надо перехватом.
 
парсер сервера тоже нужно будет переписать?
 
парсер сервера тоже нужно будет переписать?
Если вы хотите добавить или удалить какой то из параметров в эффекте скилла, то конечно же. Серверу же надо брать информацию из тхт файла о новом или удаленном параметре и дальше уже в своей длл обрабатывать это
 
0x0081F198 void CSkillInfo::ActivateSkillEffects(class CCreature*, class CObject*, enum CSkillInfo::EffectActivateTiming,class CSkillAction2*, double)
выбрал эту точку входа для изучения того, как работает Battle_roar и нахождения нужного VMT адреса...
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…