Winsor 177 Опубликовано 2 Июня 2015 Уважаемые, есть ли у кого опыт совмещения ZeroBrane Studio c библиотеками lua сталкера? т.е. такое вообще возможно? результат запуска скрипта в студии Program completed in 28.76 seconds (pid: 4916). test.lua:15: attempt to call global 'system_ini' (a nil value) stack traceback: test.lua: in main chunk Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 10 Июня 2015 Уважаемые, подскажите, где можно прочитать про отличия UPDATE_Read/Write от STATE_Read/Write нетпакета? Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 10 Июня 2015 Уважаемый @Struck, очень внимательно причитал acdc но не смог найти описания отличий STATE от UPDATE части нетпакета, не могли бы Вы подсказать - куда именно мне обратить свое внимание? Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 10 Июня 2015 Спасибо всем за информативные ответы. Вникать пытаюсь, так как не понимаю до конца как все работает... К сожалению - после прочтения Ваших постов вогнал себя в непонимание еще больше. Задача - сохранять свои данные (например, пару строка-число) в некоем буфере. Пытаюсь использовать для данной задачи net_packet self.storage - заспавленный на уровне объект, стою возле него, т.е. он в онлайне... local s_storage=alife():object(self.storage:id()) local packet=net_packet() далее заполняю packet стандартными заголовками (vertex,custom_data,visual и т.д.) packet:w_tell() = 108 байт пишу далее свои данные (несколько таких пар) packet:w_stringZ(section) packet:w_u8(tp) packet:w_tell() = 140 байт packet_size=packet:w_tell() packet:r_seek(0) log(packet:r_tell().." "..packet:w_tell()) - в логе 0 140 s_storage:STATE_Read(packet,packet_size) log(packet:r_tell().." "..packet:w_tell()) - в логе 108 140 т.е. мои данные не записались в пакет объекта... почему? где ошибка в моих рассуждениях? Благодарю за любую информацию. Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 12 Июня 2015 Подскажите пожалуйста, каким образом можно "дождаться" перехода объекта в офлайн после вызова alife():set_switch_online(sobj.id, false) alife():set_switch_offline(sobj.id, true) не передавая управление из своей функции? while sobj.online do sleep() ?????? end Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 23 Июня 2015 Добрый день , уважаемые. каким образом можно из объекта получить доступ к биндеру этого объекта? function my_binder:__init(obj) super(obj) self.my_field = {tbl} end new_binder = my_binder(obj) obj:bind_object(new_binder) необходимо получить доступ к полю my_field биндера. Благодарю! Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 30 Июля 2015 Уважаемые, каким образом можно получить список НПС вокруг ГГ, аналогично цифре на худе? очень не хочется писать for i,65535... Благодарю за информацию! 1 Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 3 Августа 2015 ПЫС скриптах - например? хоть приблизительно, либо ключевое слово . я собственно сделал, но все равно приходится перебирать лишние данные. как я смог выяснить, какой то структуры данный, доступной для lua , которая хранит нпс "рядом" (это "рядом" на основе некоего параметра) - нет. Судя по всему - она есть, но только для движка, он же рисует на худе как то количество НПС. Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 3 Августа 2015 for k,v in pairs(db.storage) do так собственно и реализовано. Но все равно там достаточно много записей. Хотелось бы меньше Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 6 Августа 2015 ТЧ 1.0006 + НС Столкнулся с проблемой борьбы логических схем управления НПС, а именно xr_kamp и моей. Моя схема говорит НПС при видимости ящика в поле зрения начать двигаться к ящику. Все нормально если НПС не под управлением xr_kamp, action_go_position заставляет его постоянно возвращаться к костру. Пытался сделать так: local action=manager:action(xr_actions_id.stohe_kamp_base + 3) --xr_kamp.action_go_position action:add_precondition(world_property(ev_see_box_id,false)) local action=manager:action(xr_actions_id.stohe_kamp_base + 1) --xr_kamp.action_wait action:add_precondition(world_property(ev_see_box_id,false)) ev_see_box_id - айди моего эвалуатора, который возвращается true если ящик доступен для действия, костер все равно не отпускает НПС, и его несчастного начинает кидать от костра и обратно. Насколько я себе представляю - необходимо повысить приоритет моего эвалуатора в xr_kamp. каким образом это можно сделать, чтобы костер временно отпускал НПС? Благодарю за разъяснения! Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 6 Августа 2015 h0N0r - читал и раньше, и сейчас, но к сожалению, хоть там и разбирается xr_kamp - но там нет ни слова о том как отвязать нпс временно от какой то схемы, или примера использования set_weight для action.... Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 20 Октября 2015 Кстати, давно интересовал момент - как правильно будет получить количество элементов в ассоциативном массиве? Я помню делал полный перебор массива чтобы получить его размер, но может есть более приятный вариант? Быстрее будет наверное только использование метаданных (setmetatable), в которых в процедурах добавления/удаления управлять списком ключей/количеством элементов. из плюсов - в дальнейшем не надо пробегаться каждый раз по всему массиву для подсчета , а обратится сразу к переменной метаданных, из минусов - накладные вычислительные расходы на эти процедуры. Если массив очень большой - то само собой обращение к метаданным будет быстрее. если часто меняется - то считать количество можно достаточно редко. Вам выбирать Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 21 Января 2016 (изменено) Уважаемые знающие, вопрос о class_registrator.script и иже с ними. Хочу добавить свой серверный класс для работы с лампами, ТЧ 1.0006 НС АЕМ. Вот код из регистратора: 1) cs_register (object_factory, "hanging_lamp", "aem_lights.se_lamp", "AEM_LAMP", "aem_lamp") 2) cs_register (object_factory, "hanging_lamp", "se_objects.se_hanging_lamp", "O_HLAMP", "lights_hanging_lamp") 2-й пункт - это то что я хочу добавить. Проблема в том что se_objects.se_hanging_lamp биндится только в случае если 1-й пункт заккоментирован. т.е. я не могу клиентский класс (hanging_lamp) связать с разными типами (AEM_LAMP и O_HLAMP) и секциями (aem_lamp и lights_hanging_lamp) и серверными классами? когда я делаю alife:create() - я ведь создаю "по секции" а не по клиентскому классу. Подскажите, пожалуйста, где ошибка в моих рассуждениях? Изменено 21 Января 2016 пользователем Winsor Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 22 Января 2016 @naxac, т.е. такой строкой я делаю следующее cs_register (object_factory, "client_class_name", "server_class_script.class", "section_class_type", "script_clsid") 1) регистрирую в системе новый clsid script_clsid, который используется в скриптах при обращению clsid.script_clsid 2) регистрирую в системе новый тип section_class_type, который используется в описании секций объектов class=section_class_type 3) регистрирую в системе серверный класс server_class_script.class для наследования от alife_cse_* 4) регистрирую в системе связь, которая при создании серверного объекта типа section_class_type будет создавать клиентский класс client_class_name правильно? @abramcumner, да. только вопросов не убавило Вот например там написано что связка с аналогичными идентификаторами должна замещать уже существующую. почему в моем примере при наличии 1) пункт 2) просто не работает? если закомментить 1) - то все хорошо. или вопрос - как определить правильно клиентский класс (вернее наличие к нему привязки), если в регистраторе она отсутствует. Если взять для примера движковый object_factory_register - то там есть такое ADD(CClimableObject ,CSE_ALifeObjectClimable ,CLSID_OBJECT_CLIMABLE ,"obj_climable"); при создании у себя cs_register (object_factory, "CClimableObject", "se_objects.se_climable", "O_CLMBL", "obj_climable") мой класс se_objects.se_climable игнорируется. Почему? вроде все правильно. Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 22 Января 2016 @Winsor, O_CLMBL случайно не равен CLSID_OBJECT_CLIMABLE? Придумывай свои CLSID. так как раз и хочется заменить существующую привязку на свою. т.е. подставить для лестниц свой серверный класс. в all.spawn, например, все лестницы типа O_CLMBL , менять на свой новый clsid - это совсем не вариант, sed конечно никто не отменял - но почему не работает моя подмена, как написано в документе? Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 22 Января 2016 @abramcumner, может я конечно чего то не понял, но секция одна, а использование этой секции многократное. Или Вы предлагаете заменить в system.ltx , например, [climable_object] class = O_CLMBL на [climable_object] class = O_WCLB и сделать такое: cs_register (object_factory, "CClimableObject", "se_objects.se_climable", "O_WCLB", "obj_climable") Это позволит без изменения all.spawn в se_objects.se_climable получить доступ ко всем серверным объектам лестниц ? Правильно? Спасибо за разъяснения! Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 29 Апреля 2016 Уважаемые, каким образом можно узнать у трупа НПС - кто этого НПС убил? вешать регистратор на deatch_callback не очень хочется. Благодарю! Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 30 Июня 2016 Уважаемые, есть ли аналоги для m_netpk (может свои разработки), пригодные для использования? p.s. - на вопрос - чем тебе m_netpk не подходит - у него неправильно парситься пакет для оружия с подствольником. хочу увидеть альтернативу. Буду благодарен за Ваши варианты. Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 19 Июля 2016 Уважаемые знающие, столкнулся с такой проблемой при использовании m_netpk. При чтении нетпакета, например, для cse_alife_inventory_item поле num_items иногда становиться равным 255, что влечет за собой чтение далее битых данных. при этом r_eof()==false, т.е. данные в пакете еще есть, но m_netpk пытается вычитать их больше, чем они там есть. сталкивался ли кто с таким? Благодарю за информацию. Поделиться этим сообщением Ссылка на сообщение
Winsor 177 Опубликовано 19 Июля 2016 (изменено) @Winsor, а почему ты думаешь, что данные там битые? В зависимости от значения num_items наполнение нет-пакета может меняться. Подробнее, например, здесь. Ну... я в курсе что наполнение может изменяться. Пример: cse_alife_inventory_item - 99% процентов этих итемов , которые лежат в инвентори у ГГ - имеют num_items=0. т.е. полей ph_position, ph_rotation и иже с ними не имеют. но у 1-го процента итемов из инвентори случайным образом num_items==255, , и при попытке прочитать log("before "..prop.name.." "..prop.type) ret.upd[prop.name] = this["_r_"..prop.type](pk, prop.ver) log("after "..prop.name.." "..prop.type.." "..ret.upd[prop.name]) получаем такой лог: m_netpk:before num_items h8 m_netpk:after num_items h8 0 m_netpk:before num_items h8 m_netpk:after num_items h8 225 m_netpk:before ph_position f32v3 в инвентари два итема одного и того же класса. отличаются визуалом и описанием. первые две строки - все хорошо. далее num_items==255 и при попытке прочитать вектор ph_position - чтение за границы нетпакета, само собой данные в этом векторе уже считать достоверными нельзя. Вот я и хочу понять - почему num_items == 255 у итема у которого он должен быть 0. p.s. ну и у таких итемов после такого чтения r_elapsed < 0 - это ли не признак чтения за границу (elapsed=packet_size-read_position) ? Изменено 19 Июля 2016 пользователем Winsor Поделиться этим сообщением Ссылка на сообщение