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/
pathfinder 1 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 Oxygenium, а где сама функция? function give_weapon_to_actor (trader, actor) dialogs.relocate_item_section(trader, "wpn_pm", "in") dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in") dialogs.relocate_item_section(trader, "wpn_addon_silencer", "in") dialogs.relocate_item_section(trader, "wpn_knife", "in") dialogs.relocate_item_section(trader, "wpn_hk53", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "wpn_aug_a3", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "wpn_sig552", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "ammo_5.56x45_ap", "in") dialogs.relocate_item_section(trader, "sigaret", "in") dialogs.relocate_item_section(trader, "sigaret", "in") dialogs.relocate_item_section(trader, "sigaret", "in") dialogs.relocate_item_section(trader, "sigaret", "in") dialogs.relocate_item_section(trader, "sigaret", "in") dialogs.relocate_item_section(trader, "sigaret", "in") end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469426
lexer125 0 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 function mazafaka(first_speaker, second_speaker) dialogs.relocate_item_section(first_speaker, "medkit", "in") end зачем function mazafaka (trader, actor) dialogs.relocate_item_section(trader, "medkit", "in") end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469429
Министр 4 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 Oxygenium, в логе сказано, что ошибка произошла из-за сравнения какого-то числа с nil. Так что по идее, передача вещей не причем. lexer125, название аргументов (или как там их) ничего не меняет. Тем более в оригинале (trader, actor). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469445
DimOriN 43 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 (изменено) попробуй if npc_stalker:is_talking()==false p.s. if npc_stalker:is_talking() then --тут код, если мы общаемся else --тут если не общаемся end блин, не красиво удалять сообщения Как будто написал "вникуда" Изменено 26 Июля 2010 пользователем DimOriN Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469465
Unnamed Black Wolf 5 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 там может ошибка в написание какого-нить предмета или отсутствия .... Так-что проверяй. Ещё странно, если это ТЧ, а это ТЧ, т.к. функция говорит об этом. То откуда в диалог менджере 393 строка ? Хотелось на нее взглянуть.... В оригинале там кажись 370 строк кажись, и чуть поболее... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469467
Stalk15 27 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 (изменено) Я ничайно сообщение удалил ...Вот оно: npc_stalker:is_talking() - проверяет разговариваем ли или нет. not npc_stalker:is_talking() - проверяет, не разговариваем ли мы. Как правилно проверить не разговариваем ли мы? Попробоал оба варианта - не получилось.Значит это из-за моего скрипта: local talking = false function drhyrd() for k, v in pairs (db.storage) do local npc_stalker = level.object_by_id(k) if npc_stalker and IsStalker(npc_stalker) and npc_stalker:is_talking() then local Community = npc_stalker:character_community() -- talking = true if not talking then if Community and Community == "stalker" then news_manager.send_tip(db.actor, "Говорим со Сталкером", 0, "freedom", 5000) talking = true elseif Community == "freedom" then news_manager.send_tip(db.actor, "Говорим со Свободовцем", 0, "freedom", 5000) talking = true elseif Community == "ecolog" then news_manager.send_tip(db.actor, "Говорим с Экологом", 0, "freedom", 5000) talking = true elseif Community == "dolg" then news_manager.send_tip(db.actor, "Говорим с Долговцем", 0, "freedom", 5000) talking = true end if npc_stalker and IsStalker(npc_stalker) and npc_stalker:is_talking() == false then if talking then talking = false end end end end end При разговоре с НПС дейсвие срабатывает, но только один раз.Хотя флаг должен восстановится, если разговора нет.Не подскажете, в чем дело? Изменено 26 Июля 2010 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469485
Unnamed Black Wolf 5 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 Если ЗП, двиг отрубил функцию.... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469490
pathfinder 1 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 Спасибо всем, буду исследовать вылет и его причины Кстати 393 строки на самом деле нету Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469503
Министр 4 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 (изменено) Stalk15, local coms_text = { stalker = "со Сталкером", freedom = "со Свободовцем", dolg = "с Долговцем", ecolog = "с Экологом" } function ololo() if db.actor:is_talking() then --проверяем разговариет ли актор for k, v in pairs (db.storage) do --если разговариет, то перебираем неписей в поисках собеседника local npc = level.object_by_id(k) if IsStalker(npc) and npc:is_talking() and coms_text[npc:character_community()] ~= nil then news_manager.send_tip(db.actor, "Говорим "..coms_text[npc_stalker:character_community()], 0, "freedom", 5000) end end end end Ф-ию использовать в апдейте бинд_сталкера. Работает нормально, кроме одного но - при разговоре сообщение присылается постоянно, но это исправить легко, можно сделать тот же флаг. Думаю ты разберешься. Изменено 26 Июля 2010 пользователем Министр Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469513
Gektor 0 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 Народ подсобите пожайлуста . Нужно заспавненого скриптом персонажа в зове припяти увести в офлайн после получения определённого инфо_пошня. Как это осуществить, ума не приложу (опыта не хватат). Методами теней чернобыля не получается. Секция spawner в логике нцп вообще отказалась на чо либо влиять. На сталкер вики смотрел но это мне не помогло . Заранее спасибо. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469520
Stalk15 27 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 (изменено) Министр Спасибо за функцию, но на ней тоже флаг не восстанавливается, действие срабатывает только один раз: local coms_text = { stalker = "со Сталкером", freedom = "со Свободовцем", dolg = "с Долговцем", ecolog = "с Экологом" } local stope = false function drhyrd() if db.actor:is_talking() then for k, v in pairs (db.storage) do local npc = level.object_by_id(k) if IsStalker(npc) and npc:is_talking() and coms_text[npc:character_community()] ~= nil then if not stope then news_manager.send_tip(db.actor, "Говорим "..coms_text[npc:character_community()], 0, "freedom", 5000) stope = true end if not db.actor:is_talking() then if stope then stope = false end end end end end end Флаги всегда вроде работали, но в этой функции не понимаю, почему не работает. Изменено 26 Июля 2010 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469535
Министр 4 Опубликовано 26 Июля 2010 Поделиться Опубликовано 26 Июля 2010 (изменено) Stalk15, Во-первых: ты делаешь проверку на то, что актор не разговаривает в данный момент и если она проходит, то присваиваешь переменной stope false, все бы нормально, если не опять одно "но" - ты вставляешь свою проверку в усл-ие которые выполняется только когда актор разговаривает. И поэтому ничего удивительного, что вся конструкция у тебя выполняется только один раз. Во-вторых: не надо делать без особой надобности усл-ия в усл-ях, например, тот же код: if IsStalker(npc) and npc:is_talking() and coms_text[npc:character_community()] ~= nil then if not stope then... Можно представить в виде одной строки: if IsStalker(npc) and npc:is_talking() and not stope and coms_text[npc:character_community()] ~= nil then... По-моему так более читабельно, хотя решать тебе, это всего-лишь совет. Изменено 26 Июля 2010 пользователем Министр Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469686
Stalk15 27 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 Министр ты вставляешь свою проверку в усл-ие которые выполняется только когда актор разговаривает. Вот за это спасибо .Поставил вместо одного энда три - все заработало ...А теперь у меня возник вопрос:почему в этой функции после stope = true нужно ставить три энда?Как это можно опредилить, что именно три надо, обьясните кто-нибудь?Ведь если поставить один энд - игра не вылетает, типа все работает : local coms_text = { stalker = "со Сталкером", freedom = "со Свободовцем", dolg = "с Долговцем", ecolog = "с Экологом" } local stope = false function drhyrd() if db.actor:is_talking() then for k, v in pairs (db.storage) do local npc = level.object_by_id(k) if IsStalker(npc) and npc:is_talking() and not stope and coms_text[npc:character_community()] ~= nil then --if not stope then news_manager.send_tip(db.actor, "Говорим "..coms_text[npc:character_community()], 0, "freedom", 5000) stope = true end end end if not db.actor:is_talking() then if stope then stope = false end end end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469733
Stalk15 27 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 (изменено) Как правильно проверить ранг ГГ.Не "цифровой" ранг, а, например, Мастер или Опытный или Новичок? Пробовал так: if db.actor:character_rank() == "novice" then ... И так тоже пробовал: if db.actor:rank() == "novice" then ... Но не работает. Изменено 27 Июля 2010 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469766
Charsi 441 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 (изменено) Stalk15,попробуй if ranks.get_obj_rank_name(db.actor)=="novice" then ... Проверку коммьюнити нпс, с которым разговариваешь, можно попробовать повесить на выдачу инфопорции ui_talk. Выдается при открытии диалогового окна. Биндер актора зависает? А если попробовать инициализацию звуковых объектов по функциям распихать. local tbl={путь1,путь2,путь3,..,путь8} function lyayawwe() local j=math.random(1,4) local snd_obj = xr_sound.get_safe_sound_object(tbl[j]) snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d) --или одной строкой --xr_sound.get_safe_sound_object(tbl[math.random(1,4)]):play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d) end function lyayawwewew() local j=math.random(5,8) local snd_obj = xr_sound.get_safe_sound_object(tbl[j]) snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d) end Изменено 27 Июля 2010 пользователем Charsi Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-469833
Stalk15 27 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 Charsi Спасибо, работает. ------------------------------------------------- У меня вопрос: Тут давали функцию для определения визуала НПС: function egegege() local se_obj = alife():object(id) -- , где id айдишник непися local t = amk.read_stalker_params(se_obj) if t ~= nil then local vis = t.visual vis = amk.str_explode("\\",vis) vis = vis[3] -- теперь vis есть визуал объекта get_console():execute(vis) end end Я вызываю эту функцию через диалог, но ни чего не происходит и в логе ни чего не появляется, хотя должно.Что я делаю не так? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-470033
SkyLoader 53 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 (изменено) Кто-нибудь знает: как неписю назначить смарт через скрипт и сделать его эксклюзивным для смарта, т.е. чтобы он выталкивал обычных неписей из смарта, если места на нем нету? Пытался разными способами это сделать - без результата. P.s. Министр, я надеюсь, что ты не будешь опять меня минусить, ведь я учусь скриптингу и спрашиваю знающих людей, а мне за это репу портят, и прям обидно как-то стало. Изменено 27 Июля 2010 пользователем SkyLoader Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-470129
Arhara 32 Опубликовано 27 Июля 2010 Поделиться Опубликовано 27 Июля 2010 SkyLoader, Каждая непись и так эксклюзивна, и пока она жива - никто не займёт её место, даже имея выше приоритет в списках работ. Мой вам совет - делайте нормальные, а не скриптовые гулаги. Потом споткнётесь, но падать будете долго и мучительно. Да и не зачем напрягать память игры тем, что можно сделать так, чтобы её вообще не использовать. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-470142
SkyLoader 53 Опубликовано 28 Июля 2010 Поделиться Опубликовано 28 Июля 2010 (изменено) Arhara, мне надо хотя бы назначить его на любой гулаг. Я получал название гулага по функции get_npc_gulag(obj) (если еще .name дописать). Пробовал addobject(obj) - он стал нилить работу гулага, пробовал в get_npc_gulag имя сменить - я думал, что если для непися сменить имя гулага, то он на другой пойдет , не вышло. В лагере новичков эксклюзивными являются Волк и Фанат, а остальные - обычные. Разве не так? Изменено 28 Июля 2010 пользователем SkyLoader Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-470191
AKKK1 6 Опубликовано 28 Июля 2010 Поделиться Опубликовано 28 Июля 2010 (изменено) В лагере новичков Волк и Фанат кроме того что эксклюзивные занимают работу предназначенную только для них А остальные просто эксклюзивные т.к у них в алл спавне прописанно выделенное [137] ; cse_abstract properties section_name = stalker name = esc_lager1 position = -209.067367553711,-19.7512016296387,-132.083114624023 direction = 0.062321275472641,0.00316426996141672,0.0140644172206521 ; cse_alife_trader_abstract properties money = 5000 character_profile = esc_stalker_novice ; cse_alife_object properties game_vertex_id = 61 distance = 9.80000019073486 level_vertex_id = 43968 object_flags = 0xffffffbf custom_data = <<END [smart_terrains] esc_lager = true [spawn] conserva END ; cse_visual properties visual_name = actors\novice\green_stalker_2 ; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 5 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0x617a6b75 upd:creature_flags = 0x6b upd:position = -209.067367553711,-19.7512016296387,-132.083114624023 upd:o_model = 0 upd:o_torso = 0.00316426996141672,0.062321275472641,0 upd:g_team = 0 upd:g_squad = 1 upd:g_group = 5 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 2,2,0,1,1 predicate4 = 0,2,0,2 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties ЗЫ Я удалял выделенное в алл спавне и неписи прекрасно занимают работы только гулаг уже не является для них эксклюзивным Изменено 28 Июля 2010 пользователем AKKK1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/42/#findComment-470274
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти