Дорогие друзья, в это теме мы будем делиться с вами разными функциями, написанными на движке 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 байта (используется для записи в память)
Вот пример одной из функций взято из базы Вайса
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_result
end
Затем такую функцию можно вызывать так-как все функции нах-ся в одном можно сказать "теле".
Вызывать просто:
local Zcoord = SFindGroundZFor3DCoord(xcoord, ycoord, zcoord, true)
Добавил:
Подправил немного функцию вот теперь корректно...