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, сохранили, запустили игру, новую или загрузку, и все дело в шляпе.

Навигация

[0] Главная страница сообщений

Перейти к полной версии