Tris 9 Опубликовано 28 Октября 2011 Поделиться Опубликовано 28 Октября 2011 Подскажет, кто-нибудь, где находится постоянный коллбек в бинд сталкере? • Dead Forgetting Zone • Мои работы. Обновление: 24.08.2012 Ссылка на комментарий
*Shoker* 322 Опубликовано 28 Октября 2011 Поделиться Опубликовано 28 Октября 2011 Что такое постоянный колбек? Такого нету, есть функция update, которая вызывается несколько раз в секунду (зависит от fps) Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 28 Октября 2011 Поделиться Опубликовано 28 Октября 2011 (изменено) (возвращаясь к вопросу изменения дирекции и позиции для объектов) Итак, опыты с изменениями позиции для онлайновых объектов и направления закончились успешно. Пока фатальных коллизий не замечено. Ограничения в основном локальные и требуют просто например отрегистрации НПС от работ, дабы не возвращался ... иль подобного. Что требуется? 1. Коды чтения/записи секции 'cse_abstract'. Они размещены в общем модуле для чтения нет-пакетов: m_net_utils_111027 - примечание: конфиг файл (ltx) поместить в папку конфигов. 2. Внести в конец файла 'db.script' следующие коды: --/ ----------------------------------------------------------------- --/#+# Коды для работы с секцией 'cse_abstract' объектов --/ ----------------------------------------------------------------- tControlAbstract = {} --/ массив имен объектов для чтения/изменения секции 'cse_abstract' tCse_Abstract = {} --/ id-массив объектов и параметры секции 'cse_abstract' (Table[ID] = TableParams) tSwitchObj = {} --/ id-массив объектов для перевода 'online->offline->online' (аналог AMK 'convert_npc') --/ Подготовка к чтению/изменениям параметров в секции 'cse_abstract' function Add_Control_Abstract(idObj,tParams) --/< ID-объекта и таблица [с изменяемыми параметрами] local soObj = idObj and alife():object(idObj) --/ серверный объект if soObj and type(tParams) == 'table' then tControlAbstract[soObj:name()] = tParams --/ заносим в массив для чтения/изменения 'cse_abstract' if level.object_by_id(idObj) then --/ если в онлайне: alife():set_switch_online(idObj, false) alife():set_switch_offline(idObj, true) end tSwitchObj[idObj] = true --/ заносим в массив перевода объекта 'offline->online' end end --/ Редирект функции чтения/изменения секции 'cse_abstract' function Control_Abstract(...) if m_net_utils then m_net_utils.Control_Abstract(...) end end --/------------------------------------------------------------------ - они являются общими и вызываются из внешних скриптов. 3. Добавить в соответсвующие классы серверных объектов, для которых предполазается работа с секцией 'cse_abstract', в метод STATE_Write в самое начало строку: db.Control_Abstract(self,packet) --/#+# чтение/изменение секции 'cse_abstract' Например для сталкеров в 'se_stalker.script' добавляем так: function se_stalker:STATE_Write(packet) db.Control_Abstract(self,packet) --/#+# читаем/изменяем секцию 'cse_abstract' --/ ... последующий код end Аналогично и для монстров (se_monster.script) Для серверных классов у которых отсутствует данный метод - следует его добавить. Например для броников, оружия, физ.объектов в 'se_item.script' в каждый требуемый класс добавляем типа так: --/ Броники/костюмы class "se_outfit" (cse_alife_item_custom_outfit) --/ ... предыдущие методы --/#+# добавляем function se_outfit:STATE_Write(packet) db.Control_Abstract(self,packet) --/#+# чтение/изменение секции 'cse_abstract' cse_alife_item_custom_outfit.STATE_Write(self, packet) end ... --/ Физобъекты class "se_physic" (cse_alife_object_physic) --/ ... предыдущие методы --/#+# добавляем function se_physic:STATE_Write(packet) db.Control_Abstract(self,packet) --/#+# чтение/изменение секции 'cse_abstract' cse_alife_object_physic.STATE_Write(self, packet) end 4. (для кого-то, кто не имеет аналогов AMK-кодов - самое сложное) Для работы с уже заспавненными объектами - требуются коды/алгоритм перевода объектов из оффлайна в онлайн. В АМК-моде это табличка 'convert_npc' и коды по работе с ней. Суть - если объект в онлайне требуется переводить его в оффлайн и обратно таким образом, чтобы вызывался метод STATE_Write для этого объекта. P.S. Примен кода из Simbion'а: --/ ----------------------------------------------------------------- --/ Check Switch NPCs/Items (On/Off Line) --/ ----------------------------------------------------------------- local tSwitchCnt = {} --/ массив-счетчик local tSwitchRe = {} --/ массив для перевода объектов он-офф-лайн function SwitchOffOn() --/< вызов из апдейта актора if not next(db.tSwitchObj) then return end --/> --/ локальная функция чистки local Clear = function(id) --/ чистка db.tSwitchObj[id] = nil tSwitchCnt[id] = nil tSwitchRe[id] = nil end -- local sim = alife() for id,v in pairs(db.tSwitchObj) do if sim:object(id) then --/ объект в игре if level.object_by_id(id) then --/ объект в он-лайне if v == false then --/ флаг завершения переключения Clear(id) --/ чистка else --/ ожидание перехода в офф-лайн (1-ая фаза) if not tSwitchCnt[id] or tSwitchCnt[id] < 48 then tSwitchCnt[id] = (tSwitchCnt[id] or 0) +1 else --/ макс. кол-во апдейтов актора (TODO: уточнить!) if tSwitchRe[id] then printf("SwitchOffOn:StopToOff:Id=[%s],Obj=[%s],MaxCnt=[%s]:<%s>", id, sim:object(id):section_name(), tSwitchCnt[id], "Warning!") Clear(id) --/ чистка else printf("%s:SwitchOffOn:StopToOff:Id=[%s],Obj=[%s],MaxCnt=[%s]:<%s>", sModule, id, sim:object(id):section_name(), tSwitchCnt[id], "Info!") --/ повторный перевод в офф-лайн sim:set_switch_online (id, false) sim:set_switch_offline(id, true) sim:set_interactive (id, false) --/#?# tSwitchRe[id] = true tSwitchCnt[id] = 16 end end end else --/ объект в офф-лайне if v == true then --/> переводим в он-лайне db.tSwitchObj[id] = false --/ переключаем флаг sim:set_switch_online (id, true) sim:set_switch_offline(id, false) sim:set_interactive (id, true) --/#?# tSwitchRe[id] = nil else --/ ожидание перехода в он-лайн (2-ая фаза) if not tSwitchCnt[id] or tSwitchCnt[id] < 96 then tSwitchCnt[id] = (tSwitchCnt[id] or 0) +1 else --/ макс. кол-во апдейтов актора (TODO: уточнить!) if tSwitchRe[id] then printf("SwitchOffOn:StopToOn:Id=[%s],Obj=[%s],MaxCnt=[%s]:<%s>", id, sim:object(id):section_name(), tSwitchCnt[id], "Warning!") Clear(id) --/ чистка else printf("%s:SwitchOffOn:StopToOn:Id=[%s],Obj=[%s],MaxCnt=[%s]:<%s>", sModule, id, sim:object(id):section_name(), tSwitchCnt[id], "Info!") --/ повторный перевод в офф-лайн sim:set_switch_online (id, true) sim:set_switch_offline(id, false) sim:set_interactive (id, true) --/#?# tSwitchRe[id] = true tSwitchCnt[id] = 64 end end end end else --/ объект исчез из игры printf("SwitchOffOn:NOT_NPC:Id=[%s],Flg=[%s],Cnt=[%s]:<%s>", id, db.tSwitchObj[id], tSwitchCnt[id], "Warning!") Clear(id) --/ чистка end end end --/ ----------------------------------------------------------------- Ну и далее можно пользоваться ... Пример скриптового спавна с изменением направления для заспавненного объекта: function Spawn_and_Change_Dir() --/ Спавним курточку новичка на тумбочку в подвальчике деревни новичков (на Кордоне) local soObj = alife():create("novice_outfit", vector():set(-213.0,-22.3,-127.4), 40605, 59) if soObj then --/ разворачиваем на 180град (3.14) local vDir = vector():set(0,3.14,0) --/ направление: 'воротничком к стене' --/ заносим в массив для изменения направления: db.tControlAbstract[soObj:name()] = { direction = vDir } end end Пример перемещения объекта (смена позиции и/или направления): function Change_PosDir() --/ Переносим вентилятор из каморки Сидоровича на тумбочку в подвальчике деревни новичков (на Кордоне) local soObj = alife():object("trader_ventilyator_0000") --/ находим в игре серверный объект вентилятора if soObj and level.object_by_id(soObj.id) then --/ нашли и он на текущей локации? local vPos = vector():set(-213.0,-22.3,-127.4) --/ координаты тумбочки в подвальчике local vDir = vector():set(0,3.14,0) --/ направление: 'лопастями от стены' --/ вызываем функцию добавления в массив для изменения позиции и направления: db.Add_Control_Abstract( soObj.id, { position = vPos, direction = vDir } ) end end Для объектов, не имеющих скриптывых классов (отсутствует function se_OBJECT:STATE_Write(packet) ) - данный метод не применим. Для всех остальны- по сути теперь скриптовой спавн ничем не отличим по возможностям от спавна в 'all.spawn' ! Кстати, примечание: Менять позицию онлайновым неписям и монстрам не обязательно через 'cse_abctract' - похоже достаточно в нужное время (пока в оффлайне) им просто переписать 'position' для их серверного объекта ... Изменено 28 Октября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 28 Октября 2011 Поделиться Опубликовано 28 Октября 2011 Отлично! Очень рад что у тебя это получилось. А можно ли получить не общий вариант, а вариант для одного объекта в один момент времени? Но желательно с минимальным изменением оригинальных файлов. Объект physic_object Freedom Ссылка на комментарий
Artos 99 Опубликовано 28 Октября 2011 Поделиться Опубликовано 28 Октября 2011 (изменено) _Призрак_ Минимальное изменение в любом случае требуется - это вызов кодов для парсинга начальной части нет-пакета и ее перепаковки. Для физ объекта это будет примерно так: Добавляем в исходный класс физ.объктов код: class "se_physic" (cse_alife_object_physic) --/ ... предыдущие методы --/#+# добавляем function se_physic:STATE_Write(packet) if self.name() == "my_object_name" then m_net_utils.Control_Abstract(self,packet) --/#+# чтение/изменение секции 'cse_abstract' end cse_alife_object_physic.STATE_Write(self, packet) end Если тебе требуется только для спавнящегося объекта - то более, кроме модуля нет-пакетов тебе ничего не требуется. В соответствующем месте в момент спавна своего объекта формируешь вызов: db.tControlAbstract = {} db.tControlAbstract[soObj:name()] = { direction = vDir } (см. пример) Если же имеешь ввиду 'объект уже в игре' - то ... потребуются коды перевода из онлайна в оффлайн и обратно. Хотя для случая 'при старте игры' - то можно также минималом обойтись. Изменено 28 Октября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
FLIKER 0 Опубликовано 29 Октября 2011 Поделиться Опубликовано 29 Октября 2011 (изменено) Почему в смарт террайне, схема guard не работает? Вот такой вот вылет. Подскажите в чем проблема? Вот логика. [logic@ds_lager_guard_1] active = walker@ds_lager_guard_1 [walker@ds_lager_guard_1] path_walk = guard_1_walk path_look = guard_1_look И вот что написано в гулаг.скрипт t = { section = "logic@ds_lager_guard_1", idle = 0, prior = 20, state = {0}, in_rest = "", out_rest = "" } table.insert(sj, t) Остальные схемы работают нормально, кроме этой. Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: d:\games\s.t.a.l.k.e.r\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Изменено 29 Октября 2011 пользователем Artos Жить – значит делать вещи, а не приобретать их. Ссылка на комментарий
*Shoker* 322 Опубликовано 29 Октября 2011 Поделиться Опубликовано 29 Октября 2011 Atros Спасибище за скрипты Очень пригодятся для многих квестов. Только вот ещё, есть смена позиции и дирекции, а можно НПС телепортнуть на другой уровень, изменив game vertex, не пробовал? И свои наработки лучше оформи сюда (http://www.amk-team.ru/forum/index.php?showtopic=6458&st=40) или ещё куда нить, а то тут они быстро потеряются, потом фиг найдёшь. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 29 Октября 2011 Поделиться Опубликовано 29 Октября 2011 (изменено) *Shoker* Во-первых, это всего лишь рабочий вариант, который хотя и проверен, но все же в разработке. 'Увековечивать' его не считаю нужным. Это всего лишь текущий материал для других модмейкеров, а не коды для игроков, которым взбрело в голову поковыряться в игре. Во-вторых, не писал и не собираюсь каких-либо уроков/статей/наставлений ... Все приходяще и то, что написано вчера - завтра становится устаревшим а порой и вредным. Полезное - само не забудется ... В-третьих, кто ищет - тот всегда найдет, а если не находит - значит и нет особой нужды ... По телепортации объектов на другие уровни: Телепортировать объект с текущего уровня на другой в общем-то затруднений не вызывает, полный алгоритм и коды для примера позже может быть выложу. А вот если наоборот, т.е. с неактивных локаций на текущую - тут посложнее. При загрузке игры/сэйва или типа при создании сэйва подобное вполне возможно. Над этим пока веду работу ... Есть некоторые идейки как и в процессе игры перемещать объекты с других на текущую локацию, но ... пока не все ясно. Добавлено через 2 мин.: FLIKER Кроме выложенного куска лога с фатал-еррором требуются строки из лога выше этой секции. Иначе - гадай на кофейной гуще. Добавлено через некоторое время: Вопрос к знатокам: Для предметов классов cse_alife_item_document (II_DOC) и cse_alife_item_pda (D_PDA/S_PDA) имеется параметр 'info_portion', который в исходной игре никак не задействован (пустая строка). Какова должна быть строка в конфиге предметов указанных классов, чтобы этот параметр считывал заданное значение, а не оставался пустым? Примечание: Очень не хочется быть привязанным только к all.spawn'у или перезаписывать нет-пакеты нужных объектов, чтобы использовать данный параметр. Изменено 29 Октября 2011 пользователем ColR_iT "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
dragunof 3 Опубликовано 30 Октября 2011 Поделиться Опубликовано 30 Октября 2011 (изменено) Всем привет! Не подскажите как можно удалить ремкомплект(в соли) скриптом? Изменено 30 Октября 2011 пользователем dragunof ▲ ▲ ▲ Ссылка на комментарий
speczadanie 0 Опубликовано 31 Октября 2011 Поделиться Опубликовано 31 Октября 2011 Как изменить список вещей, всегда остающихся у игрока во время боёв на Арене? Добавлено через 12 мин.: И ещё вопрос в дополнение к предыдущему. Где настраиваются координаты, куда телепортируется игрок при отказе от перехода на другую локацию? Ссылка на комментарий
Desertir 202 Опубликовано 31 Октября 2011 Поделиться Опубликовано 31 Октября 2011 (изменено) И ещё вопрос в дополнение к предыдущему. Где настраиваются координаты, куда телепортируется игрок при отказе от перехода на другую локацию? Если я прав, то в all.spawn где пути (точка и направление). На какой путь телепортировать прописывается в секции левел чейнджера тоже в all.spawn. dragunof, получить серверный объект ремкомплекта и, собственно, удалить alife():release(sobj,true) Где sobj серверный объект. Изменено 31 Октября 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Malandrinus 615 Опубликовано 31 Октября 2011 Поделиться Опубликовано 31 Октября 2011 Artos, Для предметов классов cse_alife_item_document (II_DOC) и cse_alife_item_pda (D_PDA/S_PDA) имеется параметр 'info_portion', который в исходной игре никак не задействован (пустая строка). Какова должна быть строка в конфиге предметов указанных классов, чтобы этот параметр считывал заданное значение, а не оставался пустым? Примечание: Очень не хочется быть привязанным только к all.spawn'у или перезаписывать нет-пакеты нужных объектов, чтобы использовать данный параметр. Нет строки в конфиге. Только через SDK/аллспавн/нетпакеты. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Ром 0 Опубликовано 31 Октября 2011 Поделиться Опубликовано 31 Октября 2011 (изменено) Как сделать так, чтоб нож и детектор в слоте отображались? Видел подобное в моде "RealBags"... Но вытащить именно это не получается... Помогите кто-нибудь, плиз!.. Сообщение от модератора ColR_iT Вопрос не в ту тему. Изменено 1 Ноября 2011 пользователем ColR_iT Ссылка на комментарий
Real Wolf 34 Опубликовано 1 Ноября 2011 Поделиться Опубликовано 1 Ноября 2011 Кто-нибудь знает, почему при потери НПС оружия(когда в руку НПС попадает пуля), НПС тупо стоит на месте с расставленными руками? Ссылка на комментарий
Desertir 202 Опубликовано 1 Ноября 2011 Поделиться Опубликовано 1 Ноября 2011 (изменено) Подскажите грамотную проверку на то, что все элементы массива - числа. Есть такой вариант: local a = 0 local count = #tbl for k=1,count do if type(tbl[k]) == "number" then a = a + 1 if a == count then --action end end end Изменено 1 Ноября 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Nazgool 250 Опубликовано 1 Ноября 2011 Поделиться Опубликовано 1 Ноября 2011 (изменено) Desertir, например :function IsAllNumber(t) local i=#t+1 repeat i=i-1 until type(t[i])~='number' return i==0 end if IsAllNumber(tbl) then ... end Изменено 1 Ноября 2011 пользователем Gun12 Ссылка на комментарий
Desertir 202 Опубликовано 1 Ноября 2011 Поделиться Опубликовано 1 Ноября 2011 (изменено) Черт, зациклился я на for. Про другие циклы даже не вспомнил... Может тогда и для других основных значений и немного по-другому. function is_val_tbl(t,val) local i = #t while type(t[i]) == val do i = i - 1 end return i == 0 end Кстати, что будет, если допустим у нас есть клиентский объект - obj (колбаса например) и сделать вот так: local tp = type(obj) Чему в этом случае будет равно tp? Подобным вопросам самое уместное место в топике: "Язык Lua. Общие вопросы программирования." --/ Artos Хорошо, давайте продолжим в том топике. Изменено 1 Ноября 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
_Призрак_ 11 Опубликовано 1 Ноября 2011 Поделиться Опубликовано 1 Ноября 2011 type (v) Возвращает тип параметра в виде строки. Возможные результаты этой функции - это "nil" (как строка, а не значение nil), "number", "string", "boolean", "table", "function", "thread", и "userdata". Если в v будет объект то type вернет "userdata" Freedom Ссылка на комментарий
Saruman 8 Опубликовано 2 Ноября 2011 Поделиться Опубликовано 2 Ноября 2011 (изменено) возможно для кого то вопрос покажется нубским, но как в скрипте записать косинус или синус от переменной и модуль полученного числа? Изменено 2 Ноября 2011 пользователем saruman_ten S.T.A.L.K.E.R 1.004, Народная..Солянка от 19.04.10, дополнение 14.08.10, патч 3.09.10, DMX 1.3.5, Saruman addon 1.1 Vkontakte Добавление нового транспорта в сталкер Ссылка на комментарий
Nazgool 250 Опубликовано 2 Ноября 2011 Поделиться Опубликовано 2 Ноября 2011 (изменено) Смотри таблицу математических функций luа - mаth. Р.S. Прочитай чуть выше, что написал Аrtоs (синим таким) Изменено 2 Ноября 2011 пользователем Gun12 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти