Как получить текст по объекту?

Matie_Ball

Новичок
Автор темы
6
2
Версия MoonLoader
.025-beta
В каждом кадре нахожу все прогруженные объекты с model 18633, подсвечиваю их и вывожу расстояние. Нужно в зависимости от текста объекта подсвечивать их разными цветами, но для этого в функции сравнения текста нужна ссылка на функцию, которая по объекту будет возвращать текст. Возможно что-то подобное реализовать?
В качестве аналога думал через onSetObjectMaterialText(id, data) генерировать таблицу соответствий идентификаторов с текстом и пробегать по ней в каждом кадре, но такое решение мне не нравится - id у объектов после удаления и повторной прогрузки меняются и я хз как чистить таблицу + решение очень похоже на велосипед.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Возможно что-то подобное реализовать?
возможно, но будет буквально насрано
но такое решение мне не нравится - id у объектов после удаления и повторной прогрузки меняются
они и в первом решении будут меняться, в чем разница?
с кодом ниже:
будешь иметь таблицу со всеми объектами нужной модели
избавишься от цикла по всем объектам
хранит соответствие айди объекта и его текста, что тебе и нужно
ну и очистка есть
Lua:
local events = require('samp.events')
local objects = {}
local objectModelID = 18633

function events.onCreateObject(id, data)
    if data.modelId == objectModelID then
        objects[objectModelID] = ""
    end
end

function events.onSetObjectMaterialText(id, data)
    if objects[id] then
        objects[id] = data.text
    end
end

function events.onDestroyObject(id)
    objects[id] = nil
end
 
  • Нравится
Реакции: Matie_Ball

Matie_Ball

Новичок
Автор темы
6
2
возможно, но будет буквально насрано

они и в первом решении будут меняться, в чем разница?
с кодом ниже:
будешь иметь таблицу со всеми объектами нужной модели
избавишься от цикла по всем объектам
хранит соответствие айди объекта и его текста, что тебе и нужно
ну и очистка есть
Lua:
local events = require('samp.events')
local objects = {}
local objectModelID = 18633

function events.onCreateObject(id, data)
    if data.modelId == objectModelID then
        objects[objectModelID] = ""
    end
end

function events.onSetObjectMaterialText(id, data)
    if objects[id] then
        objects[id] = data.text
    end
end

function events.onDestroyObject(id)
    objects[id] = nil
end
А разве нет какого-нибудь ссылочного вызова из объекта в поле, скажем с объектом текстуры, у которого в свою очередь есть поле с нужным текстом?))
 

Matie_Ball

Новичок
Автор темы
6
2
Это видел, но там если код переносить и адаптировать, то получится объем больше, чем весь мой скрипт. D Плюс код достаточно сложный и с первого взгляда начинающим джунам не определить насколько его реализация будет оптимальной. Может ФПС упадет с 60 до 10 и т.д.
 

Matie_Ball

Новичок
Автор темы
6
2
возможно, но будет буквально насрано

они и в первом решении будут меняться, в чем разница?
с кодом ниже:
будешь иметь таблицу со всеми объектами нужной модели
избавишься от цикла по всем объектам
хранит соответствие айди объекта и его текста, что тебе и нужно
ну и очистка есть
Lua:
local events = require('samp.events')
local objects = {}
local objectModelID = 18633

function events.onCreateObject(id, data)
    if data.modelId == objectModelID then
        objects[objectModelID] = ""
    end
end

function events.onSetObjectMaterialText(id, data)
    if objects[id] then
        objects[id] = data.text
    end
end

function events.onDestroyObject(id)
    objects[id] = nil
end
То что нужно. Спасибо.
Не знал что можно использовать такой синтаксис в lua. XD До этого использовал table.insert(table, { field1 = field1, field2 = field2 } ), поиск через прогон по всем элементам и удаление через table.remove. Теперь буду знать.)))
 

Vintik

Мечтатель
Проверенный
1,469
917
Рисую линию от персонажа до координат объекта, на точке назначения ставлю расстояние до него.
А я думал как-то по-интересному, там контур обьекта обводишь, например)
 

Anti...

Участник
242
18
Я такое юзаю, получает текст объекта по его id. Парсишь объекты в зоне стрима, получаешь id объекта(лучше вызывать через pcall
local success, objectId = pcall(sampGetObjectSampIdByHandle, v) и потом проверять, чтобы объект был больше 0, иначе крашить будет if success and objectId > 0 then сверяешь модель и получаешь текст объекта.

Lua:
local object_pool = sampGetObjectPoolPtr()

function getObjectText(id, slot)
    if memory.getuint32(object_pool + 0xFA4 + id * 0x4) ~= 0 then
        local material = memory.getuint32(memory.getuint32(object_pool + 0xFA4 + id * 0x4) + 0x217 + 0xEB4 + slot * 0x4)
        if material ~= 0 then
            return true, memory.tostring(material)
        end
    end

    return false
end

Lua:
local textStatus, text = getObjectText(id, slot) --slot 0 ставь
if textStatus then
    print(text)
end
 
Последнее редактирование: