Dennis_Chikin 3 658 Опубликовано 17 Января 2015 Поделиться Опубликовано 17 Января 2015 Ну, собственно, и tips и custom_static'и вполне годятся. В принципе же - старый бобрый "биорадарчик". Текст масштабировать смысла не вижу. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Карлан 1 049 Опубликовано 18 Января 2015 Поделиться Опубликовано 18 Января 2015 @Dennis_Chikin, ну да, только в трехмерном пространстве. Ничего сложного по сути. Прошлое видео удалил. Сделал два типа меток, различие меток по цветам в зависимости от отношения сталкера/монстра к ГГ. Улучшил алгоритмы вычисления позиции на экране для проецирования метки, так же написал алгоритм увеличения/уменьшения метки в зависимости от дальности. Все работает вполне нормально. Смотрите в 1080. 2 Ссылка на комментарий
max185 13 Опубликовано 18 Января 2015 Поделиться Опубликовано 18 Января 2015 Народ подскажите мне пожалуйста как заспавнить НПС сидящим(через скрипт) Железо: MS Windows 7 Профессиональная 32-bit SP1, AMD Athlon 64 X2 Dual Core Processor 5000+ 2.60 GHz, 3.0 GB RAM, nVidia GeForce GT440 Palit PCI-E 1024 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 18 Января 2015 Поделиться Опубликовано 18 Января 2015 "Заспавнить сидящим" - ни как. Только назначить логику kamp@, или написать что-то свое, принудительно отключающее любые другие схемы, и устанавливающее state_mgr.set_state( npc, "sit_ass" ) http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9B%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0_NPC Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Января 2015 Поделиться Опубликовано 19 Января 2015 Вопрос, есть ли какие-то подводные камни с онлайном/оффлайном аномалий... Собственно что происходит: вначале имеем некоторый набор (16 штук) аномалий, заспавненных скриптово на текущей локации. Со своими партиклами, звуками, шейпами настроенными через нетпакет, все как полагается. Перебирая эти 16, делаем следующее local obj = level.object_by_id(a) if obj and IsAnomaly(obj) then alife():set_switch_online(a, false) alife():set_switch_offline(a, true) anoms_onoff_buffer[a] = true end аномалии уходят в оффлайн, тут все норм. Через энное время их надо вернуть в онлайн. Там имеет место быть такой страшненький код while a < 65535 do if anoms_onoff_buffer[a] then log(string.format("key %i exist...", a)) local obj = alife():object(a) if obj then log("object found...") if IsAnomaly(obj) then log("switch anomaly!") alife():set_switch_online(a, true) alife():set_switch_offline(a, false) end end end a = a + 1 end страшный но вопрос то не в этом. В лог пишет что делает, и в логе я получаю запись в таком духе: key 6417 exist... object found... switch anomaly! key 6422 exist... object found... switch anomaly! и так далее, пересчитал - ровно 16 аномалий. Все четко, только в игре, в онлайне, эти аномалии больше не наблюдаются. Что я делаю не так? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
RayTwitty 508 Опубликовано 19 Января 2015 Поделиться Опубликовано 19 Января 2015 while a < 65535 do if anoms_onoff_buffer[a] then А если просто по этой таблице итерироваться, зачем while? Насколько я понял, в таблице лежат айдишники аномалий, который ушли в оффлайн - вот только их и надо переводить обратно. Хотя, конечно вопрос был не в этом и вопрос интересный... Попробуй посмотреть, как сделано управление кострами в последнем OGSE - там совершенно точно они прямо перед ГГ разжигались. Ссылка на комментарий
abramcumner 1 159 Опубликовано 19 Января 2015 Поделиться Опубликовано 19 Января 2015 Попробуй посмотреть, как сделано управление кострами в последнем OGSE - там совершенно точно они прямо перед ГГ разжигались.Там костры онлайн/оффлайн не переключаются специально, только включается/выключается аномалия. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Января 2015 Поделиться Опубликовано 19 Января 2015 while a < 65535 doif anoms_onoff_buffer[a] then Это побочный продут многоразовой переделки кода наспех, а что касается собственно основного вопроса - меньше надо заниматься писаниной кода всю ночь до утра, мне сам виноват, забыл что в другой функции у меня эти аномалии перед уводом в оффлайн дисаблятся. Ну и видимо сохраняют неактивное состояние после возврата в онлайн. Включил их обратно и все нормально стало. Так что abramcumner причину верно угадал. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Overfirst 631 Опубликовано 20 Января 2015 Поделиться Опубликовано 20 Января 2015 Народ, как стартануть таймер в АМК моде, после окончания времени которого выдается инфопоршень? В амк.скрипт че то писать надо... Помогите плиз! Ранее был известен под ником BoBaH_671. Ссылка на комментарий
AndrewMor 527 Опубликовано 20 Января 2015 Поделиться Опубликовано 20 Января 2015 Народ, как стартануть таймер в АМК моде, после окончания времени которого выдается инфопоршень? В амк.скрипт че то писать надо... Помогите плиз! function имя_твоей_функции() amk.g_start_timer("идентификатор",0, 0, 3) -- в кавычках - уникальный буквенный идентификатор, дальше - время. Последняя цифра - кол-во игровых минут. end В amk.script: после строк function __do_timer_action(select_string,params_string) local a пишешь: if select_string=="твой буквенный идентификатор" then ...делай все, что хочешь, в том числе и выдавай нужный поршень end BoBaH_671, а вообще-то все это легко высматривается в самом amk.script Сталкер - наше всё! Ссылка на комментарий
svarog2741 83 Опубликовано 21 Января 2015 Поделиться Опубликовано 21 Января 2015 Кто даст функцию на отбираение предмета у гг (не диалоговую) и желательно без функций амк НС - шлак, солянки - шлак. Ссылка на комментарий
Карлан 1 049 Опубликовано 21 Января 2015 Поделиться Опубликовано 21 Января 2015 @svarog2741, function transfer_item(game_object*, game_object*); Ссылка на комментарий
svarog2741 83 Опубликовано 21 Января 2015 Поделиться Опубликовано 21 Января 2015 (изменено) @Карлан, а можно полный вариант функция (пример)? dialogs.script посмотреть - не ? local actor, sim = db.actor, alife() function relocate_item_section( who, sect, d, n ) -- todo: составить таблицы, потом перемещать local r = 0 if d == "in" then for i = 1, n or 1 do if who and t_quest[sect] and i == 1 then -- квестовые предметы перемещаем local item = who:object( sect ) if item then who:transfer_item( item, actor ) else sim:create( sect, vector(), 0, 0, 0 ) end r = r + 1 else sim:create( sect, vector(), 0, 0, 0 ); r = r + 1 end end elseif who and d == "out" then for i = 1, n or 1 do local item = actor:object( sect ) if item then actor:transfer_item( item, who ) r = r + 1 end end end if r ~= 0 then news_relocate_item( actor, d, sect, r ) end return r end dc Изменено 21 Января 2015 пользователем Dennis_Chikin НС - шлак, солянки - шлак. Ссылка на комментарий
Это популярное сообщение. xStream 86 Опубликовано 24 Января 2015 Это популярное сообщение. Поделиться Опубликовано 24 Января 2015 (изменено) evid_see_stuff = 6931 -- откуда берется сия магическая цифра ? actid_reach_item = evid_see_stuff -- почему должна быть она же, а не какая другая. От балды :-) Уникальный идентификатор-число, для составления графов планировщиком.Вторая строка - для упрощения, считаем, что у эвалюатора и экшна одинаковые идшники (уникальными они должны быть не вообще, а только среди эвалюаторов, свойств (property), экшенов) local prop_idlecombat = xr_evaluators_id.state_mgr + 3 -- для чего здесь и далее вот это local prop_contact = xr_evaluators_id.stohe_meet_base + 1 -- и откуда оно опять таки берется. Ну, то есть, интуитивно (и дальнейшими тестами) понятно, что первое - дабы не получилось анимации из анекдота про "до батареи одни уши доехали", а второе - чтобы разговор не обрывал, и актора не подвешивал. Но а по-русски это все как сказать ? Аналогично - просто назначаем каким-то свойствам идшники - нам в криптах удобнее работать с "говорящими" именами переменных, чем писать числа, ошибиться легко И, опять же, по-русски - почему недостаточно просто action = manager:action( xr_actions_id.alife ) action:add_precondition( world_property( evid_see_stuff, false ) ) Это важная часть: мы говорим движку, что переключение на движковую схему алайфа происходит только тогда, когда наш эвалюатор возвращает false (то есть судя по названию - когда чета-там не видим, тогда можно переходить на движковую схему). По сути, мы заставляем планировщик проверять всегда этот эвалюатор, ибо цель у планировщика всегда одна - перевести жертву под движковую схему xr_actions_id.alife. Эти две строчки обязательно должны быть в любой схеме, которая запрещает переход в алайф (можно запрещать что-то другое, что в свою очередь запрещает алайф.... сложно, в общем, теория графов и прочая лабуда) Так вот, по идее этого достаточно :-) Этого достаточно, если нам надо какой-то эвалюатор добавить. Но есть еще экшн! И вот мы его настраиваем: указываем, что требуется для запуска этого экшена и к изменению какого свойства мира (property) он приведет - как раз ниже. Мы указываем, что в результате выполнения экшена нашей схемы (а их в схеме может быть несколько), свойство видимости (ну выше которое определяли) станет равно false, что в свою очередь позволит планировщику перевести в будущем нашего непися под алайф (помним - алайф это конечная цель планировщика) Экшен перестанет выполняться, когда не будет выполнено хотя бы одно условие (в нашем примере - если вдруг нападет враг, свойства изменятся, и сталкер бросит затею поднять предмет) Наконец, самое интересное, это вот это магическое сочетание: action:add_effect( world_property( evid_see_stuff, false ) ) manager:add_action( actid_reach_item, action ) - где add_effect со значением false не понятен даже и интуитивно, хотя вполне нагляден, если и его закомментировать. Ну или в оригинале примерно ту же функцию выполняет эквилибристика с evid_near_stuff. ------------------ Краткий итог: есть свойства, которые мы задаем через человекочитаемые имена и уникальные числовые ИДшники (для планировщика) Есть экшены, результатом работы которых будет переключение этих свойств из true в false и наоброт. И есть эвалюаторы - нечто, некий код, результатом которого является опять же булевое значение - по сути эвалюатор возвращает значение свойства. Тут легкая путаница - по сути свойства это именованные результаты работы эвалюаторов, но к этому довольно быстро привыкнуть, если считать это разными сущностями Дополнительные коментарии вот тут -- задаем от балды УНИКАЛЬНЫЙ ИДшник эвалюатора/свойства/экшена смотря, где использовать -- но принято префиксом переменной (evid_) указывать, чей это ИДшник. Сейчас - ИД эвалюатора evid_see_stuff = 6931 -- это уже ИДшник экшена (действия) просто делаем такой же, как у свойства (эвалюатора) -- префикс actid_ actid_reach_item = evid_see_stuff function add_to_binder( npc, ini, scheme, sect, st ) local manager = npc:motivation_action_manager() -- это просто локальные переменные, указывающие определенные эвалюаторы ДРУГИХ схем. Так делать нехорошо, лучше именовать все такие "магические" значения - чтоб не было плюсов, а были нормальные имена как ниже (1) local prop_idlecombat = xr_evaluators_id.state_mgr + 3 local prop_contact = xr_evaluators_id.stohe_meet_base + 1 -- собственно добавляем в планировщик наш эвалюатор: первый параметр функции - название (ИДшник) свойства(эвалюатора - помним, это почти одно и то же - свойство есть результат работы эвалюатора) -- второй - собвственно сам объект эвалюатора manager:add_evaluator( evid_see_stuff, ev_see_stuff( st, "ev_see_stuff" ) ) -- создаем экшн action = act_reach_item( "act_reach_item", st ) -- ниже идут строчки, где мы перечисляем, при каких условиях начнет выполняться наш экшн -- сталкер жив (1 - нормальное имя) action:add_precondition( world_property( stalker_ids.property_alive, true ) ) -- у сталкера нет врага action:add_precondition( world_property( stalker_ids.property_enemy, false ) ) -- у сталкера нет опасности action:add_precondition( world_property( stalker_ids.property_danger, false ) ) -- ... action:add_precondition( world_property( prop_contact, false ) ) action:add_precondition( world_property( xr_evaluators_id.sidor_wounded_base, false ) ) action:add_precondition( world_property( blowout_scheme.evid_anomaly, false ) ) action:add_precondition( world_property( blowout_scheme.evid_blowout, false ) ) -- ... а тут мы указываем, что чтобы наш экшен запустился, наш эвалюатор был true - судя по названию переменной, когда сталкер видит объект (а это проверяется в эвалюаторе) action:add_precondition( world_property( evid_see_stuff, true ) ) action:add_precondition( world_property( prop_idlecombat, true ) ) -- теперь говорим планировщику, что в результате действия нашего экшена, сталкер перестанет видеть объект -- свойство станет равно false (я так понимаю, сталкер просто подберет предмет) action:add_effect( world_property( evid_see_stuff, false ) ) manager:add_action( actid_reach_item, action ) action = manager:action( xr_actions_id.alife ) action:add_precondition( world_property( evid_see_stuff, false ) ) end Извиняюсь за постоянные повторения - но это важнно и не всегда все сразу усваивают :-) Изменено 24 Января 2015 пользователем xStream 3 2 4 Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
sapsan 336 Опубликовано 24 Января 2015 Поделиться Опубликовано 24 Января 2015 (изменено) А не может ли кто-нибудь либо кинуть ссылко на статеечку, либо написать собственно эту самую статеечку про схемы вот На это ссылка была уже. Там многобуквенно, но многовато воды. А основная "черная магия" не улавливается. Выше - лучше. dc Изменено 25 Января 2015 пользователем Dennis_Chikin Ссылка на комментарий
Kondr48 314 Опубликовано 1 Февраля 2015 Поделиться Опубликовано 1 Февраля 2015 (изменено) Если нужно обязательно в броники или стволы, то тут лучше всего записывать в кастом дату. А скорость чтения какова?) Если мне нужно будет например из колбека на взятие предмета прочитать из кастом даты данные, это нормально? =) И где можно посмотреть пример использования?) P.S данные типа строка = значение Изменено 1 Февраля 2015 пользователем Вампир35 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 1 Февраля 2015 Поделиться Опубликовано 1 Февраля 2015 На взятие - почему нет ? (Единственно что, надо иметь в виду, что при загрузке взятие отрабатывается для ВСЕХ предметов, и если их много - тогда будет ой.) С брониками и стволами нет, но есть, например, телепорты. При создании: tt = get_anomaly_data( obj ) cd = parse_custom_data( tt.custom ) cd.cd = { ["id"] = v } tt.custom = gen_custom_data( cd ) set_anomaly_data( tt, obj ) При входе в онлайн: local ini = self.object:spawn_ini() local n = ( ini and ini:section_exist( "cd" ) and ini:r_string( "cd", "id" ) ) or abort( "(%s):reload, invalid section [cd]", self.object:name() ) local id = self.object:id() self.teleport = n -- идентификатор для чтения параметров t_ids[n], t_spawn[id] = id, n В принципе, можно проще. Здесь сразу предполагается странное, поэтому еще добавлено разбор кастомдаты и ее преобразование обратно в строку. Если не нужно - можно сразу строкой и записать. Функции брать традиционно из амк, (ну или альтернативные ). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Overfirst 631 Опубликовано 6 Февраля 2015 Поделиться Опубликовано 6 Февраля 2015 Добрый день. Меня мучает один вопрос: как узнать координаты ГГ на мультиплеерной карте? Ранее был известен под ником BoBaH_671. Ссылка на комментарий
macron 1 884 Опубликовано 8 Февраля 2015 Поделиться Опубликовано 8 Февраля 2015 как узнать координаты ГГ на мультиплеерной карте? rs_stats 1 разве не катит ? Ссылка на комментарий
AndrewMor 527 Опубликовано 9 Февраля 2015 Поделиться Опубликовано 9 Февраля 2015 А возможно ли технически при ранге ГГ скажем, более 5000, в окне разговора показывать его не мастером, а скажем, легендой? Сталкер - наше всё! Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти