Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
RayTwitty 567 Опубликовано 13 Декабря 2014 Поделиться Опубликовано 13 Декабря 2014 if outfit and outfit:section() == "my_super_duper_outfit" then db.actor.power = db.actor.power + 0.1 endpower это же свойство. Получается к уже прибавленному 0.1, будет прибавляться текущее значение выносливости. Надо писать db.actor.power = 0.1. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-899974
BlooderDen 233 Опубликовано 13 Декабря 2014 Поделиться Опубликовано 13 Декабря 2014 power это же свойство , я думал что db.actor.power это собственно силы гг - то есть полоска выносливости. Следовательно получится что мы сделаем ее рамной 0.1 - то есть 10% сил у гг будет. Я не прав ? , прошу прощения. Теперь я понял. db.actor.power у нас это то что отнимается или добавляется к силам гг в зависимости от знака. Может быть от 0 (нет смысла включать) до 1, где 1 - 100% сил. То есть если db.actor.power = -1 и зацикленно в апдейте - гг не может двигаться (в NLC - жадинка. там нашел). Зная это - можно придумать и свою формулу. Это именно то что я искал. Ну а power_restore_speed - это просто значение к которому движок приравнивает db.actor.power. То есть общая скоросто восстановления(или убытка) сил считается по формуле db.actor.power = power_restore_speed(от артефактов - движок) + power_restore_speed(костюма). Вот на выходе и получается то что нужно. И все это в сумме не должно превышать 1. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-899981
Dennis_Chikin 3 665 Опубликовано 14 Декабря 2014 Поделиться Опубликовано 14 Декабря 2014 (изменено) Интересно, только я вижу здесь странное (xr_meet.script): function Cmeet_manager:get_key_from_distance(t) local key for k,v in pairs(t) do if v.dist >= self.dist then key = k else return key end end return key endили ни кто сложной логики типа 40|something1, 20|something2, 10|something3 - никогда не писал, а потом не удивлялся результату ?Все всегда пишут 5|... , 10|... , 20|... ? Или в данном случае сортировка движком при заполнении таблицы все же срабатывает правильно ? 2 BlooderDen, да, просто я забыл за давностью лет: при чтении получаем текущее значение, а при записи - записанное суммируется с текущим. Повесить на выполнение, скажем, раз в пять секунд вывод в лог что-то типа log( "test", "actor.power = %s", actor.power ) actor.power = 0.1 log( "test", "actor.power > %s", actor.power ) - все будет вполне наглядно - вместо того, чтобы упало до 0.1 - второй раз будет то же значение, а после завершения текущего апдейта - добавится вот этот самый 0.1. Кстати, если хочется посмотреть, как влияют те же арты, или еще что - вешаем на раз в секунду, и получаем как раз сумму всего-всего за эту секунду. Весьма наглядно. Изменено 14 Декабря 2014 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-900022
BlooderDen 233 Опубликовано 14 Декабря 2014 Поделиться Опубликовано 14 Декабря 2014 при чтении получаем текущее значение, а при записи - записанное суммируется с текущим. Огромное спасибо - два в одном(). Это круто и очень удобно =) Кстати, если хочется посмотреть, как влияют те же арты, или еще что - вешаем на раз в секунду, и получаем как раз сумму всего-всего за эту секунду. Весьма наглядно. Так и думал проверить подобным образом. Не успел - разжевали все до пыли и в рот положили =) Спасибо огромное всем-всем! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-900188
Dniwe 3 Опубликовано 14 Декабря 2014 Поделиться Опубликовано 14 Декабря 2014 (изменено) Товарищи, подскажите функцию, которая при использовании каждый раз выдаёт разные тайники . То есть говоря проще, функцию на рандомную выдачу тайника @Dniwe, В оригинале ТЧ к примеру этим заведует treasure_manager.script.сколько в нем не ковырял, нужного не нашёл... Знаю что задаётся переменная, которой присваивается список нужных тайников. И через Math. random используется Изменено 19 Декабря 2014 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-900216
AnonimA 1 Опубликовано 19 Декабря 2014 Поделиться Опубликовано 19 Декабря 2014 (изменено) Подскажите как изменить место старта игры.ps. не через sdk Изменено 19 Декабря 2014 пользователем AnonimA Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901421
Zander_driver 10 348 Опубликовано 19 Декабря 2014 Поделиться Опубликовано 19 Декабря 2014 Через алл.спавн например. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901424
Dennis_Chikin 3 665 Опубликовано 19 Декабря 2014 Поделиться Опубликовано 19 Декабря 2014 Если уж в скриптовании, то в bind_stalker.script после if self.bCheckStart then ... _G.g_start_avi = true дописать self.object:set_actor_position( куда надо ) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901429
Карлан 1 050 Опубликовано 19 Декабря 2014 Поделиться Опубликовано 19 Декабря 2014 @Dennis_Chikin, оно только в пределах текущей локации, корректнее делать именно через all.spawn. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901436
AnonimA 1 Опубликовано 20 Декабря 2014 Поделиться Опубликовано 20 Декабря 2014 Помогите с отключением ролика в начале игры на ЧН. Пробовал сам разобраться через ui_movies, но без результатов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901577
Romann 623 Опубликовано 20 Декабря 2014 Поделиться Опубликовано 20 Декабря 2014 AnonimAПосмотри в ui_mm_main.xml Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901578
Notfounded 0 Опубликовано 21 Декабря 2014 Поделиться Опубликовано 21 Декабря 2014 Здравствуйте, собственно, появилась одна нерешаемая для меня задачка: if self.tt if gi and gi:parent()==nil then items_value = 0gi:iterate_inventory(function (d,item)if lootable_table[item:section()] == true thenif items_value < 100 thenitems_value = items_value+item:cost()*item:condition()/30endgi:transfer_item(item,npc)endif items_value >= 100 thenself.st.block_search=truexr_sound.set_sound_play(self.object,"corpse_loot_good")elseif items_value > 0 and math.random(items_value) < 50 thenself.st.block_search=truexr_sound.set_sound_play(self.object,"corpse_loot_bad")endend, nil)corpse_checked[gi:id()]=falseendclearGObject(self.st)endend ()> Привел часть модифицированного кода из скрипта обыска трупов. Проблема состоит в том, что при наличии более одного трупа рядом с НПС (учитывается также и бесхозное оружие) он обрывает звук (выдрал фразы НПС из ЗП, когда они после обыска радуются или злятся, в зависимости от ценности трофеев) Пробовал ставить задержки (я в этом слабоват, поэтому так и не понял как нормально поставить задержку на действие). Чем можно исправить этот недочет? (А да, на всякий случай - скрипт для ТЧ от Red75) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901722
перегар 94 Опубликовано 21 Декабря 2014 Поделиться Опубликовано 21 Декабря 2014 (изменено) Всем здравствуйте! Вопрос: копал торговлю и подумал что ведь есть наверное функция удаления предметов из ивентаря нпс, "торговцев", при продаже ему чего либо, заодно бы убрать полотна после [generic_sell] оставив только то чем он торгует, ведь ассортимент минимален по сравнению с тем что тама понаписано. В поиске по инету нашел только строчку actor_binder: on_item_take(obj), но самой функции нету, если не трудно подскажите. ---------- Хотя простых неписей лучше не трогать, а то не вооружить не приодеть не получится. Изменено 21 Декабря 2014 пользователем перегар Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901737
Dennis_Chikin 3 665 Опубликовано 21 Декабря 2014 Поделиться Опубликовано 21 Декабря 2014 (изменено) Вот та самая ссылка, которая в голосовалке зачем-то - в ей все и есть. str = pick_section( actor, npc, tt.buy_supplies ) if ( tt.current_buy_supplies ~= str ) or ( not tt.resuply_time ) or tt.resuply_time < game.get_game_time() then npc:buy_supplies( tt.config, str ) -- здесь все и удаляется. Кстати, поправил вчера вот как раз чтоб get_game_time() сравнивалось, а не глобальное. А ежели buy_supplies нету - оно до этого момента и не добирается. Ну и таки да, все полотна про 15700 костюмов с мигающими красным ПНВ все нормальные люди из всех конфигов посносили лет 5 назад, потому что по дефолту все прекрасно берется из system.ltx [trade] buy_price_factor_hostile = ; коэффициент покупки при goodwill = -100 buy_price_factor_friendly = ; коэффициент покупки при goodwill = 100 sell_price_factor_hostile = ; коэффициент покупки при goodwill = -100 sell_price_factor_friendly = ; коэффициент покупки при goodwill = 100 Изменено 21 Декабря 2014 пользователем Dennis_Chikin 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-901745
Overfirst 637 Опубликовано 22 Декабря 2014 Поделиться Опубликовано 22 Декабря 2014 (изменено) Ребята, как сделать таймер без вывода на худ, время которого подойдет к концу и выдается инфопоршень?Я делаю мод на АМК Изменено 22 Декабря 2014 пользователем BoBaH_671 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-902063
Eugen81 1 008 Опубликовано 22 Декабря 2014 Поделиться Опубликовано 22 Декабря 2014 как сделать таймер без вывода на худ, время которого подойдет к концу и выдается инфопоршень? local timer = 0 function твоя_функция(delta) if not has_alife_info("твоя_инфо_порция") then --// если в игре нет инфо, то timer = timer+delta if timer>2000 then --// устанавливаем промежуток времени. сейчас 2 секунды db.actor:give_info_portion("твоя_инфо_порция") --// выдаем инфо end end end Вешать на апдейт актора в bind_stalker.script --// после строки function actor_binder:update(delta) --// добавить свой вызов твой_скрипт.твоя_функция(delta) 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-902081
svarog2741 83 Опубликовано 23 Декабря 2014 Поделиться Опубликовано 23 Декабря 2014 Ребят, напиши в лс. Как зарегистрировать новые анимации НПС? Чтоб сталкер мог их использовать при помощи логики. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-902398
Полтергейст 38 Опубликовано 26 Декабря 2014 Поделиться Опубликовано 26 Декабря 2014 (изменено) Выкладываю все накопившиеся скриптовые правки, т.к. времени на доработку всё меньше. Может понадобится кому. http://rghost.ru/59995539 Кому интересно, можете потестить или использовать правки в своих модах. Небольшое описание того, что я там накодил и зачем это может понадобиться (вчера времени хватило только на readme, поэтому пишу сейчас). В архиве лежит папка с правлеными скриптами оригинала ТЧ 1.0006 со скриптами от мода "AI вертолётов" (тоже правлеными). Изменения: Дописана и переписана внушительная часть скриптов, на которых работает игровая логика и которые в модах почти никто существенно не меняет. Скрипты серверных объектов: Класс гулагов (который в оригинале вынесен в файл xr_gulag) объединён с серверным классом самого smart_terrain. Переписан механизм выбора смартов и назначения работ. Хранение npc_info и индексов работ перенесено в серверные объекты классов se_stalker и se_monster. Хранение информации о логике людей и зверюшек (секция логики, активная секция и т.д.) также перенесено в их серверные объекты. Изменены условия для наполнения "рейдовых" работ. Скрипты клиентских объектов: В state_mgr полностью вырезана обработка "animstate", вместо которых введена возможность добавлять переходы из одной анимации в другую (минуя into/out анимации). Можно добавлять параметры at и dt, которыми можно задать произвольное время attach/dettach предметов после начала анимации. Добавлена возможность ставить непрерывные последовательности из нескольких анимаций для отыгрывания случайных анимаций. Восстановлены кое-какие старые анимации. И самое главное - все скриптовые действия обрабатываются отдельным планировщиком, в motivation_action_manager ничего постороннего добавлять нельзя. move_mgr не нужно обновлять искусственно, для установки целевого пути или вершины уровня достаточно вызвать set_movement или reset. Прочее: Небольшие изменения task_manager'а. Теперь для заданий на защиту и уничтожения лагеря надо указывать защищаемых или зачищаемых группировок во избежание путаницы. Из дополнительных скриптов (которых нет в оригинале) используется: - Offline alife, динамические аномалии и выброс от amk - Обход аномалий (своя реализация) - Подбор предметов (из билда AMKII) - Скрипты от мода "AI вертолётов" от Kirag. Из существенного вроде всё, остальное - правка багов, оптимизация и правки для упрощения отладки. Некоторые правки ещё сыроваты, требуют тестирования и доработки. К ним можно отнести: 1) Совместимость механизма обхода аномалий с выбросом - хоть я и везде поставил удаление рестрикторов при уходе game_object в оффлайн, иногда всё же могут проявляться вылеты. Либо я где-то чего-то не доглядел, либо это баг в движке. 2) "Рейдовые" работы и их использование в заданиях на защиту лагеря надо ещё потестировать, правка относительно свежая. 3) Кое-какие восстановленные анимации надо переназначить на другие состояния/слоты анимации, или отключить. Из известных недоработок - вырезана пси-раненность и использование схемы xr_detector. Первое планировалось заменить на полноценную схему поведения, второе убирал для тестов, а вспомнил об этом только после того, как выложил. Вырезано управление переходом online/offline со стороны работ, но это не баг - так и планировалось сделать после добавления amk offline alife. Впрочем, если это для кого-то критично, не сложно вернуть обратно. Из-за введения отдельного скриптового планировщика могут возникнуть сложности с адаптацией схем поведения NPC, но по примерам существующих схем можно разобраться. Что можно просто взять и перетащить к себе в мод почти без адаптации: - скрипт для добавления и удаления меток (файл mapspots.script и строки в bind_stalker.script с отсылками к нему) - файл class_registrator.script - намного упрощает поиск названий серверных и клиентских классов, а также их clsid и конфиговых имён. - функции check_gvid и validate_accessibility из файла move_mgr - функции add_call_source_marker и remove_call_source_marker и используемые в них таблицы - для отлавливания зависших вызовов и измерения времени работы вызываемых функций. Изменено 10 Января 2015 пользователем BFG 2 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-903270
Dennis_Chikin 3 665 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 Господа присяжные заседатели ! А не может ли кто-нибудь либо кинуть ссылко на статеечку, либо написать собственно эту самую статеечку про схемы, а конкретно вот про такую черную магию: evid_see_stuff = 6931 -- evid_near_stuff = evid_see_stuff + 1 -- evid_see_body = evid_see_stuff + 1 -- 2 -- evid_position_corrected = evid_see_stuff + 3 actid_reach_item = evid_see_stuff function add_to_binder( npc, ini, scheme, sect, st ) local manager = npc:motivation_action_manager() 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 ) 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 ) ) action:add_precondition( world_property( evid_see_stuff, true ) ) -- action:add_precondition( world_property( evid_near_stuff, false ) ) action:add_precondition( world_property( prop_idlecombat, true ) ) -- action:add_effect( world_property( evid_near_stuff, true ) ) 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 ) ) -- action = manager:action( stalker_ids.action_danger_planner ) -- action:add_precondition( world_property( evid_see_stuff, false ) ) end - ну, это я тут позакомментировал ненужного мне, поскольку переписано со сносом over 2/3 исходного, но собственно вопросы по черной магии: evid_see_stuff = 6931 -- откуда берется сия магическая цифра ? actid_reach_item = evid_see_stuff -- почему должна быть она же, а не какая другая. 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 ) ) Наконец, самое интересное, это вот это магическое сочетание: action:add_effect( world_property( evid_see_stuff, false ) ) manager:add_action( actid_reach_item, action ) - где add_effect со значением false не понятен даже и интуитивно, хотя вполне нагляден, если и его закомментировать. Ну или в оригинале примерно ту же функцию выполняет эквилибристика с evid_near_stuff. Не, если я это сам начну расписывать - то даже и сам же потом не пойму. А кому-то, глядишь, могла бы и польза выйти. Да и себе бы сегодня день сэкономил на вспоминание "кто на ком стоял", если бы статеечка была. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-904809
Desertir 202 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 Та самая статья, про которую я где то уже упоминал. Там вроде все тобой спрошенное описано. Там вообще вся скриптовая логика описана Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/299/#findComment-904822
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти