Vice Lua > Скриптинг
Пишем свои функции LUA, работа с памятью.
(1/1)
mfisto:
Дорогие друзья, в это теме мы будем делиться с вами разными функциями, написанными на движке LUA. Итак...
Начнем с того, что писать функции гораздо проще, чем просто опкодовой системой, поскольку мы можем вписывать вычисления в любую структуру записи функции LUA.
Что здесь важно знать: что такое память, сколько байтов нужно прочитать-записать, можно ли прочитать или записать адреса.
Функции с помощью которых можно работать с памятью:
med_ReadFloat(adress) - читает 4 байта с точкой
med_ReadInt(adress) - читает 4 байта
med_ReadWord(adress) - читает 2 байта
med_ReadByte(adress) - читает 1 байт
med_WriteInt(adress, var) - пишет 4 байта
med_WriteWord(adress, var) - пишет 2 байта
med_WriteByte(adress, var) - пишет 1 байт
med_WriteFloat(adress, var) - пишет 4 байта с точкой
med_AllowEditingMemory(adress, Int) - обозначение памяти для работы в ней в дальнейшем (в этом случае можно записывать любую память, даже защищенную)
med_EndEditingMemory() - освобождение обозначенной памяти
med_NewObject(Int) - выделение памяти для создания своей структуры
med_DeleteObject(pointer) освобождение памяти структуры
med_FLOAT_TO_HEX(var) - спец команда для обозначения значения с точкой в памяти как 4 байта (используется для записи в память)
Вот пример одной из функций взято из базы Вайса
--- Код: Lua ---function SFindGroundZFor3DCoord(x, y, z, bool_flag) local bool_pointer = med_NewObject(1); local result_pointer = med_NewObject(4); if (bool_flag ) then med_WriteByte(bool_pointer, 1) else med_WriteByte(bool_pointer, 0) end local float_result = med_CallFuncF(0x04D53A0, 4, med_FLOAT_TO_HEX(x), med_FLOAT_TO_HEX(y), med_FLOAT_TO_HEX(z), bool_pointer ); -- результат тоже нужно конвертить. med_WriteInt( result_pointer , float_result ) float_result = med_ReadFloat( result_pointer ) med_DeleteObject( result_pointer ) med_DeleteObject( bool_pointer ) return float_resultend
Затем такую функцию можно вызывать так-как все функции нах-ся в одном можно сказать "теле".
Вызывать просто:
--- Код: Lua ---local Zcoord = SFindGroundZFor3DCoord(xcoord, ycoord, zcoord, true)
Добавил:
Подправил немного функцию вот теперь корректно...
Prographer:
Прошу прощения за глупый вопрос, но как задействовать новый скрипт в VC Lua? Я так понимаю, сохранить скрипт в папку scripts\missions и добавить строку в файл main.lua с содержанием require "scripts/missions/<имя_файла>"?
Sektor:
Да, можно сделать так:
--- Код: Lua ---require "scripts/missions/mission_2"Можно в любой папке держать миссии, скрипты.
mfisto:
С помощью функции require можно делать перегрузку скриптов при начале новой игры, либо загрузке сохранения не выходя из игры. Для этого нужно провернуть небольшой фокус.
Пишем в области события OnStartGame()
--- Код: Lua ---package.loaded["scripts/start"] = nilrequire "scripts/start"
В скрипте start пишем необходимые строчки и усе...Захотели изменить стартующие скрипты, поменяли файл start, сохранили, запустили игру, новую или загрузку, и все дело в шляпе.
Навигация
Перейти к полной версии