SCM опкодов обычно достаточно для создания какого-либо мода, но иногда бывает, что нужной функции попросту нет, и приходится искать адреса или рассчитывать оффсеты филдов струкрур. Вот именно в таких моментах очень кстати будет этот модуль, так как он "заменяет" адреса и оффсеты на
константы и структуры.
Примеры:
1. Вывод информации о пуле с транспортом
2. Рендер позиции всех педов в стриме
3. Разворот транспорта на 180 градусов
Разработчики: FYP, LUCHARE
За структуры спасибо DK22Pac и его plugin-sdk
константы и структуры.
Примеры:
1. Вывод информации о пуле с транспортом
Lua:
local samem = require 'SAMemory'
local key = require 'vkeys'
samem.require 'CPool' -- дефайн используемых структур
samem.require 'CVehicle'
-- теперь не надо приводить типы переменных в таблице библиотеки
-- local vehicle_pool = samem.cast('CPool **', samem.vehicle_pool)
function main()
while true do
if wasKeyPressed(key.VK_1) then
local pool = samem.vehicle_pool[0]
if pool ~= samem.nullptr then -- проверка пула на доступность, нулевой индекс нужен для вызова эвента метатаблицы, который разыменует указатель
print('vehicle pool:')
print(('[slots] total: %d, free: %d, used: %d'):format(pool:size(), pool:free_slots(), pool:used_slots()))
for slot, veh in pool('CVehicle') do -- в итератор передаем тип данных объекта пула (для правильной индексации)
print(('[slot #%d] pointer: 0x%08X, scm handle: %d'):format(slot, tonumber(samem.cast('unsigned int', veh)), pool:get_handle('CVehicle', veh)))
end
else
print('Pool is unavailable.')
end
end
wait(0)
end
end
Lua:
local samem = require 'SAMemory'
local key = require 'vkeys'
local vec2d = samem.require 'vector2d'
samem.require 'CPool'
samem.require 'CPed'
local text = {
draw = false;
font = renderCreateFont('IMPACT', 11, 8, 0);
pos = vec2d.new(300, 400);
}
function main()
while true do
local pool = samem.ped_pool[0]
if pool ~= samem.nullptr then
if wasKeyPressed(key.VK_2) then
text.draw = not text.draw
end
if text.draw then
local temp_y = text.pos.y
for slot, ped in pool('CPed') do
local pos = ped.pMatrix.pos
renderFontDrawText(text.font, ('#%d. posn: %f, %f, %f'):format(slot, pos.x, pos.y, pos.z), text.pos.x, temp_y, -1, true)
temp_y = temp_y + 13 -- размер шрифта + 2
end
end
end
wait(0)
end
end
Lua:
local samem = require 'SAMemory'
local key = require 'vkeys'
samem.require 'CVehicle'
samem.require 'CTrain'
function main()
while true do
if wasKeyPressed(key.VK_BACK) then -- Backspace
local veh = samem.player_vehicle[0]
if veh ~= samem.nullptr then
if veh.nVehicleClass == 6 then -- с поездом немного иначе
local train = samem.cast('CTrain *', veh)
train.fTrainSpeed = -train.fTrainSpeed -- просто инвертируем скорость, его, конечно, можно развернуть, но в сампе это не синхронизируется
return
end
local matrix = veh.pMatrix
-- разворот на 180 градусов
matrix.up = -matrix.up -- у 2d и 3d векторов перегружен оператор унарного минуса
matrix.right = -matrix.right
-- инверт вектора скорости
veh.vMoveSpeed = -veh.vMoveSpeed
end
end
wait(0)
end
end
Разработчики: FYP, LUCHARE
За структуры спасибо DK22Pac и его plugin-sdk
Вложения
Последнее редактирование: