Можно ли хранить данные рядом с блоком пользовательских данных изнутри lua? - PullRequest
0 голосов
/ 26 января 2019

Я делаю мод для игры под названием Scrap Mechanic и пытался найти детали, чтобы легко общаться друг с другом. Обычно это означало бы создание глобальной таблицы, заполнение этой глобальной таблицы переменными, которые я хочу передать, а затем извлечение их из другой части с использованием идентификатора части, которая ее сохранила. Проблема в том, что это громоздко, и мне было интересно, есть ли простой способ заставить это работать. API lua для игр выглядит примерно так:

self = {interactable = {<interactable>, id = 1}, shape = {<shape>, id = 1}}

Их больше, но основная часть состоит в том, что они содержат основные функции API. Я могу переключаться между двумя, используя функции, получать данные из игры и устанавливать переменные, такие как выходные данные блока (к сожалению, я могу установить только 1 переменную и 1 логическое значение, что затрудняет передачу больших объемов). Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь сохранить значение в self.interactable или self.shape, оно изменяется для каждого объекта в игре на это значение, а не просто помещается рядом с userdata / metatable ( до сих пор не уверен, какой из 2 это так помочь с этим также было бы здорово).

Теперь я попытался использовать inserttraw или что-то еще, а также другие функции, связанные с метатаблицами, чтобы игнорировать функцию __newindex, которая может быть в таблице, но я не могу получить доступ к этой части библиотеки и там есть шов, чтобы нет других ответов в Интернете на это. Я также подумал о том, чтобы, возможно, получить собственную часть из self.interactable, но у меня есть доступ только к интерактивному и (по крайней мере, в игровом API) способу вернуться из интерактивного к себе, но здесь вопрос не в этом, хотя ответ на это очень помог бы, потому что я могу хранить данные самостоятельно, не мешая другим частям.

function test1.server_onFixedUpdate( self, dt ) --code for one of the parts
    self.interactable.testValue = 1
end

function test2.server_onFixedUpdate( self, dt ) --code for another part
    print(self.interactable:getSingleParent().testValue) --returns the interactable of the connected part and accesses testValue
    print(self.interactable.testValue)
end

При этом вы ожидаете, что результат будет читать 1, nil, но вместо этого он будет читать 1, 1, что говорит о том, что testValue был помещен в обе части. При печати self.interactable он печатает только {<interactable>, id = 1}, что заставляет меня думать, что он хранит значение внутри метатаблицы, которое является значением по умолчанию для каждой части. А использование insertraw( self.interactable, testValue, 1 ) просто возвращает мне неизвестную глобальную ошибку (если я использовал здесь не ту функцию, не волнуйтесь, я правильно ее набрал в коде).

...