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 Ссылка на комментарий
Nazgool 250 Опубликовано 23 Мая 2015 Поделиться Опубликовано 23 Мая 2015 local obj = alife():create(taynik, vector():set(-660.22509765625,19.935060501099,72.809051513672), 125131, 314) level.map_add_object_spot_ser(obj.id, "ui_pda2_actor_box_location" , "DEBAG") 1 1 Ссылка на комментарий
RayTwitty 516 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 (изменено) Даже не знаю куда писать... Либо сюда, либо сразу в справочник, но суть в чём: Есть код 1: local s = get_hud():GetCustomStatic("static") if not s then s = get_hud():AddCustomStatic("static") end s:wnd():SetText("text")И код 2: get_hud():AddCustomStatic("static", true):wnd():SetText("text")Первый код вешает апдейт актора, а второй нет. Почему так? Исходники смотрел, там вроде всё нормально. З.Ы. второй аргумент AddCustomStatic означает, что сначала будет произведен поиск статика с таким же именем и в случае успеха, он будет возвращен вместо создания нового (т.е. эквивалент функции GetCustomStatic). Изменено 24 Мая 2015 пользователем Shadows Ссылка на комментарий
7.9 174 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 может так надо - s.wnd():SetText("text") то (я) скрипты писал последний раз год назад всё легко Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 2 7.9: однозначно, нет. 2 Shadows: а проверки с логом добавить ? s = get_hud():AddCustomStatic("static") - вот здесь статик точно возвращается ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
RayTwitty 516 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 (изменено) 2 Shadows: а проверки с логом добавить ? s = get_hud():AddCustomStatic("static") - вот здесь статик точно возвращается ? local s = get_hud():AddCustomStatic("static") if s and s:wnd() then log1("yes") else log1("no") end--> yesДа и во втором варианте кода же работает. SDrawStaticStruct* CUIGameCustom::AddCustomStatic (LPCSTR id, bool bSingleInstance) { if(bSingleInstance){ st_vec::iterator it = std::find(m_custom_statics.begin(),m_custom_statics.end(), id); if(it!=m_custom_statics.end()) return &(*it); } CUIXmlInit xml_init; m_custom_statics.push_back (SDrawStaticStruct()); SDrawStaticStruct& sss = m_custom_statics.back(); sss.m_static = xr_new<CUIStatic>(); sss.m_name = id; xml_init.InitStatic (*m_msgs_xml, id, 0, sss.m_static); float ttl = m_msgs_xml->ReadAttribFlt(id, 0, "ttl", -1); if(ttl>0.0f) sss.m_endTime = Device.fTimeGlobal + ttl; return &sss; } @7.9, нет, там метод. Изменено 24 Мая 2015 пользователем Shadows Ссылка на комментарий
abramcumner 1 175 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 , так на какой строчке биндер вешается? Может у тебя в биндере дальше переменная s используется? 1 Ссылка на комментарий
chosen_one 83 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 Подскажите, как реализовать выстрел дуплетом в чн, спасибо Ты становишься старше, заводишь детей, перестаешь воровать — это грустно.(с) Ссылка на комментарий
RayTwitty 516 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 Может у тебя в биндере дальше переменная s используется?Не используется. так на какой строчке биндер вешается?s:wnd():SetText("text") Причем именно на апдейте надо это делать. При единичном вызове все нормально работает почему-то. Подскажите, как реализовать выстрел дуплетом в чн, спасибоЗадай zoom_enabled = off в конфиге. Хотя не уверен, что сработает в ЧН, но в ТЧ 100% пашет. 1 Ссылка на комментарий
abramcumner 1 175 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 Причем именно на апдейте надо это делать. При единичном вызове все нормально работает почему-то.Проверь перед зависанием вызывался Add или Get. И что будет, если вариант 2 переписать в виде: local s = get_hud():AddCustomStatic("static", true) s:wnd():SetText("text") Ссылка на комментарий
svarog2741 83 Опубликовано 24 Мая 2015 Поделиться Опубликовано 24 Мая 2015 ,может глупый вариант, но всё же. В первом коде есть условие, а второй вызывается от какого-нибуть чего-нибудь там. Да хоть от булки хлеба. НС - шлак, солянки - шлак. Ссылка на комментарий
Outfater 288 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 Всем привет. Не знаю, может не в тему пишу - как сделать (в ТЧ), что бы при получении ГГ нескольких определенных инфопоршней на экране появлялось опред. сообщение? Спасибо. Ссылка на комментарий
k01jan 816 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 @Outfater, а <info_portion id="имя_инфо"> <action>скрипт.функция</action> </info_portion> чем не устраивает? Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 (изменено) local t_info, t_info_any, t_info_n = {}, {}, 0 function add_on_info( f, nfo ) -- ( функция, инфо ), либо f для любых инфо if nfo then local t = t_info[nfo] if t then table_insert( t, f ) else t_info[nfo] = { f } end else t_info_n = t_info_n + 1; t_info_any[t_info_n] = f end end function actor_binder:info_callback( npc, nfo ) for i = 1, t_info_n do t_info_any[i]( nfo, npc ) end local t = t_info[nfo] if t then for i = 1, #t do t[i]( nfo, npc ) end end ltasks_proceed() -- Сюжет ltasks_process_info( nfo ) -- Отметки на карте end local sms_t = { -- info, текст; todo -- сделать проверку живости авторов ["sms_pulya"] = "sms_pulya_text", ["sms_lukash"] = "sms_lukash_text", ["sms_serega"] = "sms_serega_text", ["sms_borov"] = "sms_borov_text", ["sms_volk"] = "sms_volk_text", ["sms_shurup"] = "sms_shurup_text", ["sms_dan"] = "sms_dan_text", ["sms_new_dan1"] = "sms_new_dan1_text", ["sms_new_dan2"] = "sms_new_dan2_text", ["mitya_dead_sms_sidor"] = "Здорово Меченый, это Сидор,зайди есть посылка любопытная" } function send_sms( sms ) if sms_t[sms] then actor:give_info_portion( sms ) amk_tip( game.translate_string( sms_t[sms] ), nil, nil, 30 ) end end -- was: wawka function add_krysyk_pomer_treasure() treasure_manager.get_treasure_manager():give_treasure( "esc_secret_village_rucksack" ) end function check_bes_dead() if actor:has_info( "val_pula_ammo_start" ) and actor:dont_has_info( "val_pula_ammo_done" ) then timer_start( "send_sms", math_random( 20, 30 ), "sms_pulya" ) timer_start( "send_sms", math_random( 50, 60 ), "sms_lukash" ) timer_start( "send_sms", math_random( 70, 80 ), "sms_serega" ) end end ... info_f = { ["gar_hellcar_umer"] = check_bes_dead, -- по-моему, это info ни кто не генерит ["bandit_krisyk_umer"] = check_krysyk_dead, ["esc_vagon_wounded_umer"] = check_tolik_dead, ["mil_freedom_member0018_umer"] = check_maks_dead, ["gar_dm_novice_umer"] = check_yurik_dead, ["marsh_dan_umer"] = marsh_dan_umer, ["ucen_talk_est"] = marsh_dan_umer2, ["mil_dolg_phase1"] = mil_dolg_attack1, ["mil_dolg_after_explode"] = mil_dolg_attack2, ["mitya_dead"] = check_mitya_dead, ["shadowman_zver_have"] = check_shadowman_zver, ["shadowman_zver_fail"] = check_shadowman_zver, ["grab_stal1_dead"] = on_death_info, ["grab_stal2_dead"] = on_death_info, ["grab_stal3_dead"] = on_death_info, ["grab_stal4_dead"] = on_death_info, ["grab_stal5_dead"] = on_death_info, ["tutorial_wounded_give_info"] = esc_shustryi, ["tutorial_wounded_start"] = esc_shustryi, ["esc_blocpost_pust"] = esc_desant_heli_1, ["esc_btr_killed"] = esc_desant_heli_2 } -- /info_f info_f_invcl = {} function on_inv_close() for k, f in pairs( info_f_invcl ) do if f and actor:has_info( k ) then f() end end end function on_info( nfo, something ) log( "info", "on_info: %s, %s", nfo, to_str( something ) ) if something and something.name then log( "info", "on_info, name: %s", something:name() ) end local f = info_f[nfo] if f then f( nfo, something ) end end ... bind_stalker.add_on_info( on_info ) https://dl.dropboxusercontent.com/u/27871782/storyline.script P.S. Таймеры - не нужны ! На самом деле тот же actor:give_game_news() задержку сам умеет, без всяких таймеров. Так что здесь осталось только по тому, что переносилось когда-то незадумываясь над смыслом переносимого. Изменено 28 Мая 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
svarog2741 83 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 (изменено) @Outfater, local porsh = { 1 поршень, второй поршень} Function hhy() -- на апдейт if has_info("porsh") then Дальше сам. P.S. мог ошибиться, так как писал с телефона. Изменено 28 Мая 2015 пользователем svarog2741 1 НС - шлак, солянки - шлак. Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 Да что вас всех так на эти апдейты тянет ? Не нужны. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
svarog2741 83 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 апдейты тянет привычка. Да и с мобилы другие способы расписывать не айс. 1 НС - шлак, солянки - шлак. Ссылка на комментарий
Outfater 288 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 (изменено) @k01jan, тем что один поршень - одна функция. @svarog2741, а куда прописать local porsh и дальше ? Function hhy() -- на апдейт - тоже не совсем понял - hhy произвольно, или именно так? И что значит на апдейт? if has_info("porsh") then - тут всё понятно с условием, а куда его писать, в конец биндера под функцию, или в любую скрипт-папку? Изменено 28 Мая 2015 пользователем Outfater Ссылка на комментарий
svarog2741 83 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 а куда прописать local porshв тот же скрипт, где функция проверки. И что значит на апдейтФункция update в bind_stalker.script hhy произвольно, или именно так? да, произвольно. 1 НС - шлак, солянки - шлак. Ссылка на комментарий
Outfater 288 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 (изменено) @svarog2741, в разделе function actor_binder:update(delta) перед последним эндом сделал так: repack_ammo.on_update()if xrs_ai then xrs_ai.actor_update(delta)endif rx_ai then rx_ai.actor_update()endfunction test_prosto()local testporsh = {"test1","test1","test3"}if has_info("testporsh") then smski.poluchil_porshendend---------------------------------------------------------------------------function actor_binder:save(packet)if rx_ai then rx_ai.actor_save(packet) endart_hit.save() то что выделено жирным - это моё, остальное уже было. "test1" - инфопоршень. Правильно? p.s. Нет, не правильно. Сделал так: function test_prosto local porsh = {"test1","test1","test3"} if has_info("porsh") then smski.poluchil_porsh end Получаю вылет: [error]Arguments : LUA error: ...r\stalker Тени Чернобыля\gamedata\scripts\sak.script:8: attempt to index local 'actor' (a nil value) Потом закоммент. строку с функцией, все равно тот же вылет. Что не так? Изменено 28 Мая 2015 пользователем Outfater Ссылка на комментарий
svarog2741 83 Опубликовано 28 Мая 2015 Поделиться Опубликовано 28 Мая 2015 @Outfater, так правильно, ты вшил одну функцию в другую. Вынеси в отдельный скрипт и всё. Товарищ, Struck, если я где-то накосячил или обидел тебя извини, но не надо под каждым моим постом ставить "Не нравится". Если не согласен с моим вариантом, напиши свой. 1 НС - шлак, солянки - шлак. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти