You are not logged in.
Сегодня столкнулся с очень интересным глюком. Вот два очень простых скрипта:
Скрипт №1:
wait 3000 01E4: show_text_1number_lowpriority GXT 'number' number 10 time 2000 flag 1 end_thread
Скрипт №2:
0000: NOP end_thread
Если в памяти первый скрипт расположен перед вторым - всё нормально. Но если поменять их местами - первый скрипт почему-то не работает, текст на экран не выводится. Сделал дамп памяти - всё вроде правильно.
Прямо мистика какая-то. Помогите разобраться.
Спасибо! Тут у меня ещё один вопрос возник:
Если не ошибаюсь, типу Float в GTA соответствует типу Single в Delphi. Тогда почему при передачи значения в скрипт всегда получаю нуль?
Сравнительно недавно начал изучать Delphi, и у меня возникли некоторые вопросы по нему.
Вопрос №1.
Нужно с помощью DLL прочитать значение из INI-файла и передать его в скрипт. Функция постоянно возвращает дефолт. В чём ошибка?
Исходник DLL`ки:
uses
SysUtils,
Classes,
IniFiles;
function ReadINI(pcSection, pcParameter: PChar): Integer; stdcall;
var
IniFile: TIniFile;
sSection: String;
sParameter: String;
begin
sSection := String(pcSection);
sParameter := String(pcParameter);
IniFile := TIniFile.Create('G:\test.INI');
Result := IniFile.ReadInteger(sSection, sParameter, 0);
IniFile.Free;
end;
exports
ReadINI;Исходник скрипта:
thread 'DLLTest'
wait 5000
0A99: chdir 0
:Section
0662: NOP 'General'
:Parameter
0662: NOP 'Number1'
0A9F: 10@ = current_thread_pointer
10@ += 16
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
VAR
10@: Integer
11@: Integer
END
11@ = 10@
10@ -= @Section
10@ += 2
11@ -= @Parameter
11@ += 2
if
0AA2: 0@ = load_library "CLEO\INIReader.dll"
then
if
0AA4: 1@ = get_proc_address 'ReadINI' library 0@
then
0AA7: call_function 1@ num_params 2 pop 0 10@ 11@ 2@
01E4: show_text_1number_lowpriority GXT 'NUMBER' number 2@ time 2000 flag 1
else
01E4: show_text_1number_lowpriority GXT 'NUMBER' number -1 time 2000 flag 1
end
0AA3: free_library 0@
else
01E4: show_text_1number_lowpriority GXT 'NUMBER' number -2 time 2000 flag 1
end
end_threadВопрос №2.
Как из DLL определить папку, в которой она находится?
Вопрос №3.
Как в Delphi создать тип float и перевести в него переменную типа String или PChar?
Как определить, фары у машины были бы включены или нет, если они не были бы разбиты?
Приведи код.
Не думаю, что в коде проблема. Если просто нажать ручник - то же самое. Наверно, глюк игры.
//-------------MAIN---------------
0000: NOP
1@ = 0xB73458
1@ += 13
:thread
wait 0
if
actor.Driving($PLAYER_ACTOR)
jf @thread
0A8C: write_memory 1@ size 1 value 255 virtual_protect 0
jump @thread[---]
И ещё, если не трудно, помоги разобраться в разнице между +12 и +13. Я только заметил, что если нажать ручник, изменяется значение только в +12.
Когда ручной тормоз нажат.
Зато я сам нашёл! Проверял все смешения от 0xB73458 (пул управления авто) и наконец нашёл. Их почему-то два оказалось: +12 и +13. Только тут один глюк есть - CJ не может выйти из машины, как будто у неё заперты двери. Не знаешь почему?
Определить, нажат он или нет. (Проверка клавиши мне не подходит.)
И ещё значение изменить.
Какой адрес отвечает за ручной тормоз в авто?
На gtamodding не нашёл. Помогите кто-нибудь. Ну пожалуйста...
Кто нибудь подскажите код -> как получить текущие компоненты машины
096D: get_car 0@ car_component 7 on_slot 17@
-------------------------------------------
Теперь мой вопрос.
Подскажите, пожалуйста, адрес ручника в памяти, а то на gtamodding найти не удалось.
Как вычислить адрес, загруженной в память текстуры?
Как вычисляется адрес строки в скрипте?
Спасибо.
Задача такая - создать и подключить к игре ASI плагин.
Вообщем, делаю так:
1) Создал функцию.
2) Запихнул её в DLL-файл.
3) Сохранил в папке с GTA SA с расширением ASI.
Как теперь подключить функцию к моему скрипту. Я так понимаю опкодом 0AA7? Если да, то как вычислиь адрес функции?
Пожалуйста, помогите!
Подскажите пожалуйста, почему при создании короны опкодом 024F она исчезает во время движения автомобиля, а после остановки появляется снова?
Как вычислить адрес, где расположен хэндл какого-либо педа и их общее кол-во?
CraZZZy-GameRRR wrote:Как из main.scm удалить ТОЛЬКО МИССИИ (без под-миссий, мини-игр, экстернал скриптов и т.д.)?
Может ссылку на уже готовый файл дадите или поможете советом?
Помогите пожалуйста! Очень нужно.Посмотри на сайте ZAZ. Кажется то.
Спасибо!
Как из main.scm удалить ТОЛЬКО МИССИИ (без под-миссий, мини-игр, экстернал скриптов и т.д.)?
Может ссылку на уже готовый файл дадите или поможете советом?
Помогите пожалуйста! Очень нужно.
Но он же после чтения закрывается опкодом 0A9B: closefile 21@, а потом снова проверяется на существование и открывается с помощью проверки if 0A9A: 21@ = openfile "CLEO\Settings.ini" mode 0x72?
Когда первый раз читаю файл нижеуказанным скриптом всё нормально. При следующих попытках чтения в переменную 20@ записывается какая-то чепуха.
0A99: chdir 0
if
0A9A: 21@ = openfile "CLEO\Settings.ini" mode 0x72
jf @THREAD_3
0A9D: readfile 21@ size 3 to 20@
0A9B: closefile 21@Может, я что не так делаю?
От меня тоже спасибо! С разрешением всё понятно, с текстом кое-как сам разобрался.
вообщето плагины на делфи пишутся
Для меня не принципиально - я ни ассемблер, ни делфи не знаю. Знаю только старый добрый бэйсик, да и то "поверхностно".
ширина и высота экрана в СА всегда одинакова
Это в единицах измерения расстояния на экране, а мне нужно узнать именно разрешение экрана в пикселях.
Что касается считывания текста из файла, попробовал написать следующий скрипт:
:THREAD_1
0A99: chdir 0
0A9A: $FileHandle = openfile "/CLEO/CRSPDconfig.ini" mode 0x72
if
$FileHandle
jf @THREAD_3
0A9C: $FileSize = file $FileHandle size
0A9D: readfile $FileHandle size $FileSize to 0@
:THREAD_3Текст
[panel size]
в INI-файле в кодировке ANSII весит ровно 3 байта, следовательно, в переменную 3@ попадёт как раз нужное мне число 15 и ещё останется два свободных разряда (число может быть от одного до трёх разрядов типа integer).
Посмотрите, правильно?
И ещё небольшой вопрос - в опкоде
0A9A: $FileHandle = openfile "/CLEO/CRSPDconfig.ini" mode 0x72
регистр важен?
Хочу написать плагин для CLEO 3, но, увы и ах, не знаю ассемблер.
Вообщем, задача такая:
1) считываем ширину экрана и записываем её в сleo-переменную 105
2) считываем высоту экрана и записываем её в сleo-переменную 106
3) из файла CRSPDconfig.ini, находящегося в корневой папке CLEO, записавыем число из второй строки в сleo-переменную 107
[panel size] 15
Можете готовую DLL`ку сделать, или в крайнем случае исходник в *.asm дать?
здоровье меньше 200
Какой опкод заставляет машину дымиться?
Просьба воздержаться от использования красного цвета без экстренной необходимости
Какой опкод заставляет машину дымиться?