Динамически подключаемые библиотеки (dynamic link libraries, DLL) используются для уменьшения объема исполняемого файла, за счет выделения некоторых функций в отдельный файл. Более того, функции из DLL могут использовать разные загрузочные модули, что особенно важно для жизнедеятельности Windows (например в KERNEL32.DLL содержаться функции управления памятью процессами и потоками). Для создания DLL в среде C++ Builder необходимо выбрать File\New\Dll при этом автоматически генерируется проект, компиляция которого и дает искомый результат. Для написания экспортируемых функций используется следующий синтаксис: __declspec(dllexport) void nameFunc(); При компиляции, кроме прочих, создаются файлы с расширениями *.LIB и *.DLL, содержащие экспортируемые функции. Подключение DLL в C++ Builder возможно явным и неявным способом. При неявной компоновке в секцию директив необходимо добавить строку вида: #pragma link ”nameFile.lib” а, в секцию прототипов добавить описание прототипа функции: void nameFunc(); При неявной компоновке функция вызывается по имени, необходимы файлы с расширениями *.LIB и *.DLL. Библиотека подключается к процессу в момент загрузки процесса и выгружается вместе с процессом. Явная компоновка требует использования функций WINAPI LoadLibrary() и GetProcAddress(). В данном случае функция вызывается по номеру, который ей присвоен при создании DLL. C++ Builder упорядочивает экспортируемые функции DLL в алфавитном порядке их имен. Номер функции в DLL можно получить с помощью утилиты tdump с ключом -ee. Функция LoadLibrary() принимает в качестве параметра имя библиотеки, а возвращает переменную типа HINSTANCE. Функция GetProcAddress() имеет следующий прототип: void *GetProcAddress (HINSTANCE, const char *); она принимает переменную типа HINSTANCE и символическую константу, а возвращает указатель на функцию. В приведенных листингах демонстрируется создание, неявная и явная компоновки DLL. //Пример создания DLL #include <vcl.h> #pragma hdrstop int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } //Выше находится заголовок DLL, генерируется автоматически double dblValue(double); double halfValue(double); __declspec(dllexport) int AreturnValue(bool); __declspec(dllexport) int CreturnValue(bool); __declspec(dllexport) int BreturnValue(bool); int CreturnValue(bool i) { i= true; return(2); } int BreturnValue(bool i) { i= true; return(3); } int AreturnValue(bool i) { i= true; return(1); } double dblValue(double value) { return value * value; }; double halfValue(double value) { return value / 2.0; }
//Пример неявной компоновки DLL #ifndef useDllU1H #define useDllU1H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //-------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TLabel *Label1; TLabel *Label2; TLabel *Label3; TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //-------------------------------------------------------- extern PACKAGE TForm1 *Form1; //-------------------------------------------------------- int AreturnValue(bool); int CreturnValue(bool); int BreturnValue(bool); #endif
int (*returnVa1)(bool); int (*returnVa2)(bool); int (*returnVa3)(bool); //-------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner) {//Создание формы hinst=LoadLibrary("dll_cb_c.dll"); returnVa1=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(1)); returnVa2=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(2)); returnVa3=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(3)); } //На форме имеется одна кнопка и три метки void __fastcall TForm1::Button1Click(TObject *Sender) { bool buf_b; int j; buf_b=false; if(returnVa1==NULL) Label1->Caption=AnsiString("Error"); else { j=returnVa1(buf_b); Label1->Caption=AnsiString(j); } Label2->Caption=AnsiString(returnVa2(buf_b)); Label3->Caption=AnsiString(returnVa3(buf_b)); } MAKEINTRESOURCE — макрос для создания символической константы. Переменная типа HINSTANCE создается глобально. Загрузка библиотеки и присвоение указателей на функции производится в момент создания формы. Количество и тип параметров в описании функций (сигнатура функции) в DLL и указателя на функцию, в вызывающем модуле должны совпадать, совпадение имен не обязательно. DLL выгружается из памяти при завершении работы вызывающего модуля. Принудительная выгрузка DLL осуществляется функцией FreeLibrary(HINSTANCE).
Чтобы убрать "тормоза в игре" или одним словом улучшить производительность необходимо открыть в ХЕКС-редакторе (см. ссылку сверху) XR_3DA.exe, там в коде с помощью поиска найти цифры 45 78, найти их просто - ввести в поиске GlobalMemoryStatusEx . Далее изменить их на 00 00 и сохранить изменения. Всё. Теперь всё будет работать нормально. Способ нашёл не я - Rolan.
(С) _Призрак_ Инструкция по изменению плотности травы. Параметр меньше 0.02 не ставить - Колмогор писал что начинает лагать 1. Открываем айда 2. Открываем айда_виев 3. Теперь ищем что нам нужно найти. Нам сейчас нужно найти r__detail_density? Тогда жмем ctrl+t и вводим r__detail_density 4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, а только укажу где задаются параметры: fld ds:flt_10064400 --нижнее ограничение равное 0.6 or dword_1007CACC, 8 sub esp, 8 fstp [esp+30h+var_2C] mov ecx, offset unk_1007CA9C fld ds:flt_10064380 --верхнее ограничение равное 0.2 fstp [esp+30h+var_30] push offset aSs; "ЪЩЩ>" push offset aR__detail_dens; "r__detail_density" call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float) push offset sub_1005E080; void (__cdecl *)() call _atexit add esp, 4 Если вы заметили, то что бы трава стала плотней нужно уменьшить параметр, а что-бы травы стало меньше нужно параметр увеличить 5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть 3 варианта:
Первый и самый логичный вариант: изменить переменную которая задает. Но тут есть небольшой подвох на котором я попался. Этой переменной может пользоваться не одна функция, а несколько. И не ясно что вы можете сломать, поменяв одну циферку в переменной...
Второй: взять другую уже существующую переменную. Хороший вариант которым я и воспользовался. Но и тут есть недочет - переменных в ддлке не так уж и много и можно просто не найти нужную
Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать
Я пошел по второму пути. Два раза шелкнув на ds:flt_10064380 айда отправила меня в дебри под названием .rdata. Там я нашел переменную которая называлась - flt_1006452C и которая имела значение 0.0720999 Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C. Ну чтож приступим к редактированию! 6. Отправляем в самое начало файла. Как? Сверху есть что-то типа статус бара - строка состоящая из синего,серого,черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца 7. Опять ищем r__detail_density. Находим в этой функции fld ds:flt_10064338. Дальше самое интересное. Жмем на ХЕКС_ВИЕВ и там у нас выделяются какие-то цифры. Это наше 10064338 только написано наоборот. Сравните: 38 43 06 10 10 06 43 38 Похоже, не правда? Начинаем редактировать. нам нужно поменять 4338 на 452C т.к. в этом и есть различие. Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где нибудь в коде. Это нужно сделать обязательно. После этого жмем правой кнопкой мыши и выбираем commit changes. Но айда не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так - Файл - Produce file - Create DIF file. Назовем его test. DIF файл можно открыть при помощи блокнота и посмотреть что вы сделали. Теперь так сказать соединит этот файл и дллку. Это можно сделать при помощи bpatch. Качаем и смотрим и запускаем bpatch.cmd. Я думаю что вы сможете его изменить сами если нужно будет. Там все элементарно.
Сообщение отредактировал RETRIX - Воскресенье, 04.03.2012, 23:11
Скажу так у меня есть на то основания и очень серьезные. Увы поток отборного троллинга в этой теме меня расстраивает. Что касается того что люди не будут этим заниматься это не факт ибо пока что не перевелись программисты на земле СНГшной, не умерли под игом западным разработчики наши, не остановить им нашего сталкера красного , и моддинга прекрасного. Вот к примеру я тоже балуюсь движком и шейдерами, Скайлодер уже много добился, но людей такого уровня не еденицы и даже не десятки.
Кот, ... ммм...Ну пусть люди разговаривают, делятся своим мнением. Я думаю, это будет интересно и АП-Про...Всё-таки редко на форумах разворачиваются, пусть даже столь маленькие, разногласия, которые именно по делу...
Кот, а вот у меня наоборот есть причины утверждать обратное вашему. Увидим в скором времени, что я был прав. Автор темы, учитесь-учитесь, как говориться ученье свет, а не ученье чуть свет на работу. Вы знаете какие-нибудь языки программирования?
Давайте все вместе взвесим то, что нужно восстановить и свои возможности. Ниже укажу список важных, по моему мнению фич, которые можно было бы восстановить редактированием двигателя. Ну и хотелось бы, я бы даже был признателен, если бы меня дополняли и корректировали. (Не стоит думать, что я строю из себя какого-то бога, способного всё воссоздать, восстановить и подать, Вы должны меня понимать...ведь мы все модмейкеры, хотябы в душе, если и не на деле) Так, ближе к делу...
1)Открывающиеся двери у автомобилей 2)Удар Псевдогиганта вПрыжке 3)Показ модели предмета в инвентаре при подробном обзоре вместо иконки (3D Statick) 4)Эффекты от удара мутантов (уже восстановил Shadows, но увы эффект весьма слабый, возможно есть возможность усилить сие, правля параметры в xrGame.dll)... 5)Глобальная карта (если я не ошибаюсь более практичный вариант карты зоны из билда например 2205 был в движке, или покрайней мере его элементы)
Добавлено (21.11.2011, 23:56) --------------------------------------------- Так, сейчас попытаюсь ответить... Вы меня переоценили, мне 17й год и я в совершенстве или хотябы достойным образом ни одного языка незнаю, но уж поверьте, что скоро это будет исправлено, очень скоро. Кот, Шейдеры, скорее в графики тему...
Amicron, В каком-то из билдов, вроде даже в 2571, Псевдогигант умел прыгать Кстати, это уже было кем-то восстановлено. Не помню только кем.
А вот остальное (4, 5) - тоже не понятно. Вроде как удары монстров не относятся к правкам движка. А что не так с картой? Или хочется старый стиль, когда на карте была лишь текущая локация, а карта Зоны по отдельному клику? Имхо, сейчас самый идеальный вариант - с полностью доступной картой.
Сообщение отредактировал a8758099 - Вторник, 22.11.2011, 00:05
Так...Попробую расписать. Значится, второй пункт - удар псевдогиганта в прыжке. В двигателе билдов вроде как планировалась данная возможность, но в релиз, ясен день, включена не была...э...её можно установить врезкой в код. По сути вещь не заоблачная, но и не из лёгких. Вроде есть мод, восстанавливающий прыжок псевдогиганта, но чтобы он там наносил удар в прыжке я не видел, и другие тоже. Согласитесь, фича хоть и маленькая почти незначительная, но и придаёт игре какой-то чтоли новый фактор опасности... 4й пункт. В билдах, (даже в игромании 1 фо видно) , что когда допустим Зомби ударяет гг, то камера отклоняется и на момент в глазах краснота и ещё характерынй звук. Восстановление этой фичи, скорее всего, лежит не объязательно через движок, но так было бы практичнее. Ну а с глобальной картой не так всё просто, как и самим пда...который в билдах был тоже неособо то и доработан до ума, как планировалось. В общем так объяснить неполучится...
Добавлено (22.11.2011, 00:10) --------------------------------------------- a8758099, Вроде Амик восстановил фичу с псевдогигантом, только без удара...хм...карта...Я же сказал, что не могу так примитивно это объяснить но с картой текущей локации которую вы имели ввиду я соглашусь. такая возможность может присутствовать, но глобальная карта же всё-равно останется. Всё - таки это карта зоны. Она была и будет. Вот если реально интересно восстановить пда функционал билдовский надо копать самим и методом тыка - туторов по этому делу я не видел...
Добавлено (22.11.2011, 00:15) --------------------------------------------- Ладно, хватит мне уже болтать...Вроде бы всё сказал. Так что я пойду за работу. спасибо всем за внимание.
RETRIX, как вы думаете, почему вырезали возможность прыжка для Псевдогиганта? Вы выдели эту самую возможность вживую? Это выглядит по-идиотски. Пусть это Зона, но такая туша не может совершать такие прыжки.