Colder 12 Опубликовано 22 Октября 2023 Поделиться Опубликовано 22 Октября 2023 Помогите установить метку Скрытый текст function random_anom_spawn() local section = anom[math.random(table.getn(anom))] local lv = math.random(level_vertexes[level.name()]["lvid"]) local gv = level_vertexes[level.name()]["gvid"] for i = 1, count do create_anom(section, level.vertex_position(lv), lv, gv, 1.5, 1.0) level.map_add_object_spot_ser(section.id, "zone_zdn_mapspot", gts("st_ui_pda_legend_special")) end end Но метка ставится на гг Ссылка на комментарий
WinCap 316 Опубликовано 22 Октября 2023 Поделиться Опубликовано 22 Октября 2023 (изменено) 1 час назад, Colder сказал: Помогите установить метку Да легко! Сейчас телепаты проверят правильность таблиц "anom" и "level_vertexes", а также корректность функции "create_anom" и, поняв откуда берётся "count", быстро подскажут, где ошибка. Изменено 22 Октября 2023 пользователем WinCap 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 22 Октября 2023 Поделиться Опубликовано 22 Октября 2023 @Colder Скорее всего, прочитан id клиентского объекта как obj.id вместо obj:id() 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
naxac 2 445 Опубликовано 23 Октября 2023 Поделиться Опубликовано 23 Октября 2023 (изменено) 22.10.2023 в 22:02, Colder сказал: section.id section тут - это строка, видимо? Нужно что-то вроде local obj = creare_anom(.... level.map_add_object_spot_ser(obj.id, ..... Ну, и функция create_anom должна возвращать заспавненный объект. 22.10.2023 в 22:02, Colder сказал: метка ставится на гг Потому что первый аргумент в level.map_add_object_spot_ser равен nil Изменено 23 Октября 2023 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
НаноБот 740 Опубликовано 28 Октября 2023 Поделиться Опубликовано 28 Октября 2023 Решил переделать гравиган/гравипривод ну т.е. НПС работают с этим прибором через скриптовые схемы ИИ. Надо чтобы в момент захвата НПС удерживал захваченный предмет в прицеле, т.е. пока оружие подлетает к оператору он должен целиться на него. Эвалуатор работает, а вот экшен не всегда. Вот такой код. Скрытый текст class "action_operator_gravygun" (action_base) function action_operator_gravygun:__init(npc, action_name, storage) super(nil, action_name) self.st = storage end function action_operator_gravygun:hit_callback(amount, dir, who) local npc = self.object log1("action_operator_gravygun:hit_callback() name: "..npc:name()) end function action_operator_gravygun:initialize() action_base.initialize(self) local npc = self.object -- if npc:path_completed() then -- npc:set_desired_position() -- npc:set_desired_direction() -- end -- npc:set_mental_state(anim.danger) -- npc:set_item(object.aim1, npc:active_item()) log1("action_operator_gravygun:initialize()["..time_global().."] name: "..npc:name()) end function action_operator_gravygun:execute() action_base.execute(self) local npc = self.object local wpn = npc:active_item() if wpn and wpn:section()==gdrive_section then local target = wpn:binded_object().target if target then state_mgr.set_state(npc, "threat_heli", nil, nil, {look_object = target}, nil, nil, {yaw_delta=10}) end end end function action_operator_gravygun:finalize() action_base.finalize(self) local npc = self.object log1("action_operator_gravygun:finalize()["..time_global().."] name: "..npc:name()) end Делал на основе схемы rx_ff Bak'а, наверное надо initialize доделать, а именно раскомментировать код или ещё как настроить. 1 2 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Ссылка на комментарий
НаноБот 740 Опубликовано 29 Октября 2023 Поделиться Опубликовано 29 Октября 2023 А что возвращает best_item? Написано, это объект который монстр хочет пожевать, а я думал это предмет который сталкер хочет подобрать. И вообще, как узнать что НПС хочет что-то подобрать. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Ссылка на комментарий
CiberZold 142 Опубликовано 30 Октября 2023 Поделиться Опубликовано 30 Октября 2023 21.10.2023 в 18:54, Капрал Хикс сказал: в оригинале ТЧ можно влиять на голод ГГ скриптами? Скажем, повесить на апдейт увеличение сытости при наличии в инвентаре определённой брони? в чистом ТЧ нельзя, надо ставить правки/другой движок X-ray Ext/OGSR где игровому объекту актор добавлен метод движка db.actor.satiety = нужное значение, в оригинале же можно например скриптом заспавнить еду и заставить игрока её съесть, чтоб убрать голод, в оригинале ТЧ только 2 фактора влияют на голод, это время - уменьшает сытость и еда -увеличивает, больше ничего не влияет( 1 1 2 Ссылка на комментарий
RayTwitty 492 Опубликовано 31 Октября 2023 Поделиться Опубликовано 31 Октября 2023 (изменено) 21.10.2023 в 14:54, Капрал Хикс сказал: Подскажите, в оригинале ТЧ можно влиять на голод ГГ скриптами? Скажем, повесить на апдейт увеличение сытости при наличии в инвентаре определённой брони? Разве что спавнить с каким-то интервалом по времени невидимый батон и съедать его по-тихому. P.S. Только сейчас заметил пост выше)) Изменено 31 Октября 2023 пользователем RayTwitty 2 Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 22 Ноября 2023 Поделиться Опубликовано 22 Ноября 2023 Вроде как можно делать свои функции глобальными, не добавляя их в [_g.script]. Следующая запись дает вылет при вызове из другого скрипта:_G.new_fx = function(…) вызов new_fx(…) Как правильно оформить такую функцию? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 (изменено) Попытка переноса времени из одной метки CTime() в другую: порядок значения в мс похож на нужный год, но после вычислений не получается и половины требуемого значения. Где ошибка? Spoiler local ct0 = game.CTime() -- 01/01/0001 00:00:00 local ct = game.get_game_time() -- 01/05/2015 06:45:00 local ms = ct:diffSec(ct0) * 1000 -- ~ 64 * 10^12 local dt = game.CTime() dt:setHMS(0, 0, ms/1000) local ct1 = ct0 + dt -- 19/01/0069 03:14:00 Есть прямая копия метки, но требуется запись diffSec в память с последующим восстановлением. Дополнительный вопрос: почему последовательно прочитанные значения diffSec при аргументах "текущее время / время 0" получаются одинаковыми при разнице до получаса игрового времени? https://drive.google.com/file/d/1z5AiT9F6ddl5fPDlOXjV9N8y10QS2d7I Изменено 28 Ноября 2023 пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 207 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 @Norman Eisenherz скорее всего, дело в типе и размерности промежуточных переменных. 69 год - это (примерно) ёмкость int. Я бы предположил, что ограничение начинает работать где-то в строке "local ms = ...", поскольку diffSec сама по себе возвращает вполне вместимый float результат. Но это надо проверять. Только зачем превращать сохраняемое значение в миллисекунды? Сохранять и восстанавливать можно непосредственно результат diffSec без промежуточных умножений и делений. Ну а лично я сохранял бы в сейве все составляющие даты: local year, month, day, hour, min, sec, ms = ct:get() и восстанавливал потом также из всех: local ct1 = game.CTime() ct1:set(year, month, day, hour, min, sec, ms) 3 1 Инструмент Ссылка на комментарий
abramcumner 1 146 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 3 часа назад, Norman Eisenherz сказал: Дополнительный вопрос: почему последовательно прочитанные значения diffSec при аргументах "текущее время / время 0" получаются одинаковыми при разнице до получаса игрового времени? https://drive.google.com/file/d/1z5AiT9F6ddl5fPDlOXjV9N8y10QS2d7I Точность флоата - 7 десятичных разрядов. У тебя на скрине какой-то смысл имеют старшие 7 разрядов у чисел, в остальных мусор. Интересное наблюдение - разница между числами у тебя на скрине 4096 Вот с такой точностю с такими большими значениями работает флоат. 1 1 Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 Миллисекунды указаны по аналогии с обычным счетчиком game.time(). Сохранение diffSec в секундах не меняет картины: счет до 69-го года при подстановке и одинаковые значения diffSec при разных метках чч:мм:сс. Еще вопрос: для чего полный набор значений читается показанным ниже способом, если метод ct:get() дает все те же значения и без ввода аргументов? Spoiler [utils.script] if not editor() then CTime_0 = game.CTime() end function w_CTime( p, t ) if t and not (t == CTime_0) then local Y, M, D, h, m, s, ms = 0, 0, 0, 0, 0, 0, 0 Y, M, D, h, m, s, ms = t:get( Y, M, D, h, m, s, ms ) Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
phalcor 60 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 34 минуты назад, Norman Eisenherz сказал: Миллисекунды указаны по аналогии с обычным счетчиком В памяти игры время Ctime хранится в виде одного 64-битного ЦЕЛОГО чила, означающего количество миллисекунд, прошедших с 1-01-0001 00:00. У тебя 69 год наводит на мысль о том, что diffsec использует формать 4-х байтового float, где максимум = 2147483647 сек, что как раз и есть 69 лет. Может чем-то поможет. 2 Ссылка на комментарий
abramcumner 1 146 Опубликовано 28 Ноября 2023 Поделиться Опубликовано 28 Ноября 2023 1 час назад, Norman Eisenherz сказал: Еще вопрос: для чего полный набор значений читается показанным ниже способом, если метод ct:get() дает все те же значения и без ввода аргументов? Возможно это наследие старых версий luabind. Когда-то можно было писать только с полным набором значений. Потом стало можно писать и пустой get, но скрипты править уже не стали. 6 часов назад, Norman Eisenherz сказал: но после вычислений не получается и половины требуемого значения. Где ошибка? А это тебя еще и функция setHMS подводит в движке у нее аргументы типа int - так что да - больше 69 лет таким макаром не получишь. 1 1 Ссылка на комментарий
Colder 12 Опубликовано 3 Декабря 2023 Поделиться Опубликовано 3 Декабря 2023 (изменено) Скрытый текст local t = 0 local BACKPACK_SLOT = 8 function ItTank(obj) if not obj then return false end local list = { ["airtank"] = true, } return list[obj:section()] end local toxic_level = ini_file([[items\settings\txr_toxic_level.ltx]]):r_float("hit_level", level.name()) local min_cond = sys_ini:r_float_ex("airtank", "inv_condition") function item_to_tank() local slot = db.actor:item_in_slot(BACKPACK_SLOT) local function list(actor,obj) if slot and ItTank(obj) then if t < time_global() then local cond = obj:condition() obj:set_condition(cond-min_cond) db.actor.health = toxic_level+0.001 t = time_global() + 1000 end end end db.actor:iterate_inventory(list,db.actor) end Всем привет. У меня такая проблема если вставить в слот airtank, потом вытащить его и поставить другой. То хит наноситься всё равно 1 airtank который стоял до этого в слоте. Я так понимаю нужно присвоить ид предмету? Как мне это сделать? Изменено 3 Декабря 2023 пользователем Colder Ссылка на комментарий
WinCap 316 Опубликовано 3 Декабря 2023 Поделиться Опубликовано 3 Декабря 2023 @Colder, функция "item_in_slot" возвращает объект, находящийся в заданном слоте. Перебирать инвентарь не нужно, можно сразу работать с полученным объектом и описанная "проблема" отпадёт сама собой. 1 2 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 12 Декабря 2023 Поделиться Опубликовано 12 Декабря 2023 Чем obj:set_fastcall(fx, obj) лучше/хуже level.add_call(fx1, fx2)? Оба варианта проверки активны только в онлайне, у обоих есть авто-отключение проверки при выполнении заданного условия и, если верить старым постам, одинаково частое срабатывание отдельно от апдейта ГГ. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Это популярное сообщение. Kirgudu 1 207 Опубликовано 12 Декабря 2023 Это популярное сообщение. Поделиться Опубликовано 12 Декабря 2023 @Norman Eisenherz не лучше и не хуже, просто работают по-разному. Это примерно как разница между while do и repeat until. В add_call функция fx2 будет запущена только в том случае, если функция fx1 вернёт true (я бы сказал, что с оговорками аналог while ... do ...). А в set_fastcall функция fx будет выполнена в любом случае (repeat ... until ...). 1 6 Инструмент Ссылка на комментарий
Colder 12 Опубликовано 14 Декабря 2023 Поделиться Опубликовано 14 Декабря 2023 (изменено) Всем привет. Создал спальник который при использовании спавнит, матрас к гг под ноги и компресионый мешок в инвентарь. Возникла проблема что при использовании компресионого мешка на НЕ разрешеной дистанции компресионый мешок не спавнится обратно к гг. Скрытый текст local spawned_sleepbags = {} local dist = 1.5 function on_item_sleep(obj) if obj:section() == "sleep_bag" then -- спальный мешок alife():create("compression_bag", pos, lvid, gvid, pid) -- спавним компресионый мешок гг pos.x = pos.x + 1 pos.z = pos.z + 0 local matt = alife():create("mattress", pos, lvid, gvid) -- спавним матрас spawned_sleepbags[matt.id] = true elseif obj:section() == "compression_bag" then for id, v in pairs(spawned_sleepbags) do local sp = level.object_by_id(id) if sp and (v == true) then local sp_distance = sp:position():distance_to(db.actor:position()) if (sp_distance < dist) then alife():release(alife():object(sp:id()), true) -- удаляем матрас и спавним мешок обратно alife():create("sleep_bag", pos, lvid, gvid, pid) local bag = db.actor:object("compression_bag") -- удаляем компресионый мешок у гг alife():release(alife():object(bag:id()), true) spawned_sleepbags[id] = nil break end end end end end Изменено 14 Декабря 2023 пользователем Colder Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти