Автор Тема: Пишем свои функции LUA, работа с памятью.  (Прочитано 1281 раз)

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 169
  • Репутация: +18/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Дорогие друзья, в это теме мы будем делиться с вами разными функциями, написанными на движке 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
  1. function SFindGroundZFor3DCoord(x, y, z, bool_flag)
  2.         local bool_pointer = med_NewObject(1);
  3.         local result_pointer = med_NewObject(4);
  4.  
  5.         if (bool_flag ) then
  6.                 med_WriteByte(bool_pointer, 1)
  7.         else
  8.                 med_WriteByte(bool_pointer, 0)
  9.         end
  10.  
  11.         local float_result = med_CallFuncF(0x04D53A0, 4, med_FLOAT_TO_HEX(x), med_FLOAT_TO_HEX(y), med_FLOAT_TO_HEX(z), bool_pointer );
  12.  
  13.         -- результат тоже нужно конвертить.
  14.         med_WriteInt( result_pointer , float_result )
  15.         float_result =  med_ReadFloat( result_pointer )
  16.  
  17.         med_DeleteObject( result_pointer )
  18.  
  19.         med_DeleteObject( bool_pointer )
  20.         return float_result
  21. end

Затем такую функцию можно вызывать так-как все функции нах-ся в одном можно сказать "теле".
Вызывать просто:
Код: Lua
  1. local Zcoord = SFindGroundZFor3DCoord(xcoord, ycoord, zcoord, true)

Добавил:
Подправил немного функцию вот теперь корректно...
« Последнее редактирование: Май 17, 2016, 05:03:10 am от mfisto »
I know everything and nothing...

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Прошу прощения за глупый вопрос, но как задействовать новый скрипт в VC Lua? Я так понимаю, сохранить скрипт в папку scripts\missions и добавить строку в файл main.lua с содержанием require "scripts/missions/<имя_файла>"?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 515
  • Репутация: +33/-0
    • Просмотр профиля
Да, можно сделать так:

Код: Lua
  1. require "scripts/missions/mission_2"
Можно в любой папке держать миссии, скрипты.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 169
  • Репутация: +18/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
С помощью функции require можно делать перегрузку скриптов при начале новой игры, либо загрузке сохранения не выходя из игры. Для этого нужно провернуть небольшой фокус.

Пишем в области события OnStartGame()

Код: Lua
  1. package.loaded["scripts/start"] = nil
  2. require "scripts/start"

В скрипте start пишем необходимые строчки и усе...Захотели изменить стартующие скрипты, поменяли файл start, сохранили, запустили игру, новую или загрузку, и все дело в шляпе.
I know everything and nothing...