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

Скриптование


Svoboда

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

Уважаемые, есть ли у кого опыт совмещения 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

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


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

Уважаемые, подскажите, где можно прочитать про отличия UPDATE_Read/Write от STATE_Read/Write нетпакета? 

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


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

Уважаемый @Struck, очень внимательно причитал acdc но не смог найти описания отличий STATE от UPDATE части нетпакета, не могли бы Вы подсказать - куда именно мне обратить свое внимание?

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


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

Спасибо всем за информативные ответы. Вникать пытаюсь, так как не понимаю до конца как все работает...

К сожалению - после прочтения Ваших постов вогнал себя в непонимание еще больше.

Задача - сохранять свои данные (например, пару строка-число) в некоем буфере. Пытаюсь использовать для данной задачи 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

т.е. мои данные не записались в пакет объекта... почему? где ошибка в моих рассуждениях? Благодарю за любую информацию.

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


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

Подскажите пожалуйста, каким образом можно "дождаться" перехода объекта в офлайн после вызова 

alife():set_switch_online(sobj.id, false)
alife():set_switch_offline(sobj.id, true)
не передавая управление из своей функции?
while sobj.online do 
 sleep() ??????
end

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


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

Добрый день , уважаемые. каким образом можно из объекта получить доступ к биндеру этого объекта?

function my_binder:__init(obj) super(obj)
     self.my_field = {tbl}
end

new_binder = my_binder(obj)

obj:bind_object(new_binder) 

 

необходимо получить доступ к полю my_field биндера.

Благодарю!

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


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

Уважаемые, каким образом можно получить список НПС вокруг ГГ, аналогично цифре на худе? очень не хочется писать for i,65535... 

Благодарю за информацию!

  • Полезно 1

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


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

 

 

ПЫС скриптах
- например? хоть приблизительно, либо ключевое слово :) . я собственно сделал, но все равно приходится перебирать лишние данные. как я смог выяснить, какой то структуры данный, доступной для lua , которая хранит нпс "рядом" (это "рядом" на основе некоего параметра)  - нет. Судя по всему - она есть, но только для движка, он же рисует на худе как то количество НПС.

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


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

 

 

for k,v in pairs(db.storage) do

так собственно и реализовано. Но все равно там достаточно много записей. Хотелось бы меньше :)

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


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

ТЧ 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. каким образом это можно сделать, чтобы костер временно отпускал НПС?
Благодарю за разъяснения!

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


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

 

 

h0N0r
- читал и раньше, и сейчас, но к сожалению, хоть там и разбирается xr_kamp - но там нет ни слова о том как отвязать нпс временно от какой то схемы, или примера использования set_weight для action.... :(

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


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

Кстати, давно интересовал момент - как правильно будет получить количество элементов в ассоциативном массиве? Я помню делал полный перебор массива чтобы получить его размер, но может есть более приятный вариант?

Быстрее будет наверное только использование метаданных (setmetatable), в которых в процедурах добавления/удаления управлять списком ключей/количеством элементов. из плюсов - в дальнейшем не надо пробегаться каждый раз по всему массиву для подсчета , а обратится сразу к переменной метаданных, из минусов - накладные вычислительные расходы на эти процедуры. Если массив очень большой - то само собой обращение к метаданным будет быстрее. если часто меняется - то считать количество можно достаточно редко. Вам выбирать :)

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


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

Уважаемые знающие, вопрос о 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() - я ведь создаю "по секции" а не по клиентскому классу. Подскажите, пожалуйста, где ошибка в моих рассуждениях? 
Изменено пользователем Winsor

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


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

@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, O_CLMBL случайно не равен CLSID_OBJECT_CLIMABLE? Придумывай свои CLSID.

так как раз и хочется заменить существующую привязку на свою. т.е. подставить для лестниц свой серверный класс. в all.spawn, например, все лестницы типа O_CLMBL , менять на свой новый clsid - это совсем не вариант, sed конечно никто не отменял - но почему не работает моя подмена, как написано в документе? 

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


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

@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 получить доступ ко всем серверным объектам лестниц ? Правильно?
Спасибо за разъяснения!

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


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

Уважаемые, каким образом можно узнать у трупа НПС - кто этого НПС убил? вешать регистратор на deatch_callback не очень хочется.

Благодарю!

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


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

Уважаемые, есть ли аналоги для m_netpk (может свои разработки), пригодные для использования?

p.s. - на вопрос - чем тебе m_netpk не подходит - у него неправильно парситься пакет для оружия с подствольником. хочу увидеть альтернативу.

Буду благодарен за Ваши варианты.

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


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

Уважаемые знающие, столкнулся с такой проблемой при использовании m_netpk.

При чтении нетпакета, например, для cse_alife_inventory_item поле num_items иногда становиться равным 255, что влечет за собой чтение далее битых данных. при этом r_eof()==false, т.е. данные в пакете еще есть, но m_netpk пытается вычитать их больше, чем они там есть. сталкивался ли кто с таким? Благодарю за информацию.

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


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

@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) ?

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

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


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

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