Перейти к контенту

Ковыряем ОП-2


Рекомендуемые сообщения

for i=1,65534 do

А чего так не красиво?

Сейф, насколько я понимаю, уникальный. Значит и имя у него тоже будет уникально.

Если он был создан в олл спавне, то найти по имени

function add_spot_to_item_parent()    local obj = alife():object('какое_там_имя_у_него')    if obj then        parent = obj.parent_id        ... и т.д.    endend

Ну а если был заспавнен скриптом, то сохранить где-то имя объекта.

Если нет какого-либо хранилища, то взять тот же pstor хотя бы.

local obj = alife():create('inventory_sakbox_03', ...)xr_logic.pstor_store(db.actor, "inventory_sakbox_03_name", obj:name())

Ну и получить соответственно

function add_spot_to_item_parent()    local obj = alife():object(xr_logic.pstor_retrieve(db.actor, "inventory_sakbox_03_name", 'unknown'))    if obj then        ... и т.д.    endend

Даже не знаю во сколько десятков (а если "не повезет" с ID, то и сотен) раз это быстрее.

 

В принципе меня это не должно касаться. При хорошем железе такой цикл к фризам не приведет.

Это я так. В качестве рассуждения. )

Изменено пользователем BFG
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

 

Да что вы с этим сейфом мучаетесь?
Да не мучаемся мы. Это совсем не трудно. А очень даже полезно )

 

Т.е., то, что один человек закодил, другой завсегда оптимизировать сможет
Может быть когда-то человек сделал "чтобы работало" и на что знаний хватало.
Но время то идет. Слава Богу что-то узнаем новое - в общем не утратили способности развиваться.
Вот и мне, к примеру, сразу бросилась в глаза "грандиозность" идеи перебора всех и вся.

 

Хотелось бы уточнить - имеют ли значения одинарные/двойные кавычки?
Не имеют. В Lua следующие записи эквивалентны :
"red_location"
'red_location'
[[red_location]]

 

Чувствую где-то натупил...
Есть малость ). Вот тут 
alife():object(xr_logic.pstor_retrieve(db.actor, "Здесь_пишем_что_ищем_из_allspawn", "Здесь_пишем_желаемое_описание_при_наведении_на_тайник?"))
Вместо "Здесь_пишем_что_ищем_из_allspawn" должно быть "Здесь_пишем_имя_той_переменной_которую_сохраняли_в_pstor_store"
Вместо "Здесь_пишем_желаемое_описание_при_наведении_на_тайник?" должна быть некая строка. Поясню. Если в xr_logic.pstor_retrieve не будет найдена сохраненная переменная то возвратиться nil, что приведет к вылету (alife():object(nil)), поэтому нужно задать некую строку, которая возвратиться, если переменной нет. Напр. 'unknown'. Тогда объект alife():object('unknown') просто не будет найден. И без вылета.
Изменено пользователем Nazgool
  • Спасибо 1
  • Нравится 2
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
Кстати, а как может не повезти с id ?

Если id будет равен (скажем) 100, то цикл for i=1,65534 do закончиться относительно быстро (по break-у).

А если id будет за 65000? То будет крутить в 650 раз дольше. А это очень долго.

В любом случае способ перебора не есть гуд.

Даже с id до сотни скорость поиска объекта в цикле существенно проигрывает способу поиска по имени.

 

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

@alexyats

Если предмет в all_spawn-е, то имя брать тут :

...
[201]
; cse_abstract properties
section_name = flesh_weak
name = esc_flesh_normal -- вот в этой строке
...
Т.е. пишем :

function add_spot_to_item_parent()
    local obj = alife():object('esc_flesh_normal') -- не перепутать. получаем по 'name'
    ...
А если спавним скриптом, то имя будет сгенерировано автоматически.

Его нужно сначала получить :

local obj = alife():create('flesh_weak', ...) -- не перепутать. спавним по 'section_name'
local obj_name = obj:name() -- получаем имя 'name'
Если посмотреть на 'obj_name', то имя будет иметь вид 'flesh_weakDDDD', где 'DDDD' это числа, являющиеся сгенерированным игрой идентификатором.

В этом случае нам его знать и не нужно. Мы сохраним этот неизвестный id под вполне понятным произвольным именем. Например "flesh_weak_name":

xr_logic.pstor_store(db.actor, "flesh_weak_name", obj_name) -- obj_name мы получили выше
И когда необходимо получаем его по этому ("flesh_weak_name") понятному имени:

local name = xr_logic.pstor_retrieve(db.actor, "flesh_weak_name", 'unknown')

И что это за хранилище такое?

Это стандартное хранилище произвольных данных в объектах игры.

Данные пишутся в нет-пакет объекта, который имеет ограниченный размер в 8192 байта.

Поэтому необходимо следить за размером сохраняемых данных.

В данном случае пишем в пакет actor-а.

Но это уже совсем другая история.

 

И что будет, если предмет не уникален - поиск идет до первого совпадения?

Совершенно верно. Именно поэтому в моем первом посте первым предложением было сказано :

 

Сейф, насколько я понимаю, уникальный. Значит и имя у него тоже будет уникально.

...

Полезно. Не часто такие люди к нам заходят.

Eugen81.

Изменено пользователем Eugen81
Поправил форматирование чуть-чуть.
  • Спасибо 1
  • Нравится 1
  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение

@Eugen81,

Такой только перебором for i=1,65534 do.

Уникальные предметы, я считаю, на то и уникальные, что должны где-то и когда-то понадобиться.

Их нужно "запоминать". В олл-спавне обычно запоминают по story_id, ну или искать по имени.

А как запоминать при скриптовом спавне я уже показал. 

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...