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/
dsh 3 824 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 (изменено) @losiara, у меня нет исходников 1.0004, но думаю, этот код не менялся. Судя по вылету, что-то запросило информацию о группировке из строки communities, которой там нет. Т.е. в communities указано меньше группировок. Изменено 25 Января 2017 пользователем dsh 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062287
AndrewMor 533 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Товарищи скриптеры, прошу помощи. 1. Как вообще отключить системный респавн в чистом ТЧ? 2. Правильно ли я понимаю, что респавн вызывается ТОЛЬКО из smart_terrain.script в функции se_smart_terrain:call_respawn()? 3. И достаточно ли для отключения респавна полностью закомментировать строку se_respawn.spawn( self.gparams.respawn )? Просьба знающих ответить по пунктам. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062413
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 1. se_respawn.script: -- Обновление в офлайне function se_respawn:update() cse_alife_smart_zone.update( self ) --'printf("RESPAWN: [%s] se_respawn update_offline", tostring(self:name())) self:execute() end Здесь с этим можно что-нибудь сделать. 2. нет, неправильно. Это заполнение синих ящиков патронами от пм и воткой. 3. недостаточно. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062416
AndrewMor 533 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) Dennis_Chikin, в каком-то уроке видел вызов респавнера из рестриктора: %=respawner_spawn(имя респавнера)% - соответственно, функция из xr_effects.script, которая как раз и вызывает se_respawn.spawn. Выходит, урок неправильный? (Сейчас проверить не могу, ибо на работе). Тогда выходит надо комментировать все вызовы функций se_respawn:execute, se_respawn:update, se_respawn:update_online в se_respawn.script? П.С. Тогда верно ли, что респавн вызывается из bind_respawn.script, строчкой self.se_respawn:update_online()? И достаточно ее закомментировать для того, чтобы системный респавн не вызывался вообще? Мне собственно что нужно: полностью вырубить системный респавн НПС и мутов, но оставить возможность вызова конкретного респавнера скриптово в необходимый момент времени. Изменено 26 Января 2017 пользователем AndrewMor Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062420
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) bind_respawn.script - это при заходе на локацию. xr_effects.script - это если вызывается еще откуда-то (из непися, дверей, ворон и прочих лампочек). соответственно, убираешь то, что тебе не нужно, и оставляешь то, что нужно. Что-то я переутомился, что-ли... self.dir1 = npc:direction() local npc_pos = npc:position() local n = 1 local lvid1, pos local dir = self.dir1 for i = r1, r1 + 10, 2 do lvid1 = level.vertex_in_direction( npc_pos, dir, i ) if lvid1 ~= npc_lvid then pos = level.vertex_position( lvid1 ) log( "info", "r1: %s, i: %s, lvid: %s, dist: %s", r1, i, lvid1, pos:distance_to( npc_pos ) ) end endr1: 7.8898077011108, i: 7.8898077011108, lvid: 43, dist: 229.41188049316r1: 7.8898077011108, i: 9.8898077011108, lvid: 43, dist: 229.41188049316 r1: 7.8898077011108, i: 11.889807701111, lvid: 43, dist: 229.41188049316 r1: 7.8898077011108, i: 13.889807701111, lvid: 43, dist: 229.41188049316 r1: 7.8898077011108, i: 15.889807701111, lvid: 43, dist: 229.41188049316 r1: 7.8898077011108, i: 17.889808654785, lvid: 43, dist: 229.41188049316 Изменено 26 Января 2017 пользователем Dennis_Chikin 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062425
gam 118 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Что-то я переутомился, что-ли... что за проверка if lvid1 ~= npc_lvid then параметр npc_lvid это npc:level_vertex_id()? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062437
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) Да. А есть разница ? Мне нужно, банально, какой-нибудь вертекс там, куда смотрит непись. Не прямо под носом, и не очень далеко. Любой, блин. Вертекс, который в 300 метрах сзади непися - это что-то явное не то. upd: однако, и вправду переутомился. в vertex_in_direction() должна быть не позиция, а npc_lvid. Изменено 26 Января 2017 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062439
gam 118 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) не совсем понял использование lvid1 = level.vertex_in_direction( npc_pos, dir, i ) npc_pos - должен быть npc:level_vertex_id() dir - заменяет вектор i - это радиус в пределах которого будет двигаться нпс. т.е npc_pos и дожен стать точкой куда двинется нпс. Изменено 26 Января 2017 пользователем gam Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062443
dsh 3 824 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 level.vertex_in_direction( npc_pos, dir, i ) Т.е. получается, что level.vertex_in_direction( npc_pos, dir, 17 ) возвращает вертекс на расстоянии 229 метров? Чудеса. lvid1 = level.vertex_in_direction( npc_pos, dir, i ) Только сейчас обратил внимание. Почему npc_pos? Тут нет ошибки? Разве первый параметр не должен быть вертекс, а не позиция? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062454
AndrewMor 533 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 bind_respawn.script - это при заходе на локацию. Так все-таки я так и не въехал до конца. Что и где конкретно надо закомментить, чтобы отрубить системный респавн? Если нетрудно, разжуй пожалуйста Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062465
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) Только сейчас обратил внимание.Ага, видимо, холода на всех действуют... системный респавн если именно регулярный, который в локациях где актора сейчас нет - тогда self:execute() в se_respawn:update() npc:accessible_nearest() в каком случае 1 возвращает ? -1 я уже видел, nil - тоже. Что у него еще припасено ? Изменено 26 Января 2017 пользователем Dennis_Chikin 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062466
AndrewMor 533 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 если именно регулярный, который в локациях где актора сейчас нет А есть и другой? Под системным респавном я всегда подразумевал стандартный респ НПС и мобов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062588
MJRamon 0 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Поднял один вопрос о выполнении скриптов в игре без паузы, в связи со срочностью дам здесь ссылку на вопрос: http://www.amk-team.ru/forum/topic/5525-soc-kovyriaemsia-v-fajlakh/?p=1062559 Очень нужна помощь. Спасибо. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062589
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Гм. Чем дальше в лес, тем толще партизаны... lvid1 = level.vertex_in_direction( npc_lvid, self.dir[1], i ) С разных исходных позиций: targets[1], r1,i: 9.4276762008667,9.4276762008667, lvid: 29341, dist: 0.65685898065567 targets[1], r1,i: 9.0319900512695,9.0319900512695, lvid: 30935, dist: 9.6079540252686 targets[1], r1,i: 9.4302082061768,9.4302082061768, lvid: 31782, dist: 0.99326068162918 Какой смысл задавать ему расстояния ? А есть и другой? Под системным респавном я всегда подразумевал стандартный респ НПС и мобов. Все-таки это погода. Есть и другой. bind_respawn.script Как видно из когда, работает только на текущей локации. Где se_respawn:update() не работает. Делает function respawn_binder:update( delta ) object_binder.update( self, delta ) self.se_respawn:update_online() endЕсть еще xr_effects.script - когда кто-то где-то прописал что-нибудь типа %respawner_spawn(что:попало)% 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062590
TIGER_VLAD 361 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 @MJRamon, создай файл dik_hot_key.script . В нем напиши: local con = nil -- переменная для объекта консоли local con_command = "mm_net_player_name" -- консольная команда local def_value = "_" -- значение по умолчанию - символ подчеркивания function update() if not con then -- инициализируем схему con = get_console() -- кешируем консоль con:execute( con_command .." ".. def_value ) -- инициализируем дефотлным значением, т.к. кнопка не нажата for k,v in pairs(_G[script_name()]) do -- перебираем функции в текущем файле -- v это функция и её имя является кодом клавиши if type(v)=='function' and DIK_keys[string.upper(k)] then local key = "k"..string.gsub(k,"dik_","") -- формируем ключ и con:execute("bind_console "..con_command.." "..k.." "..key) -- биндим кнопку на него end end else -- получаем из консоли значение параметра для нашей команды local str = con:get_string(con_command) -- если оно не является значением по умолчанию -- и в этом файле есть функция с таким именем, то выполняем её if str~=def_value and this[str] then this[str]() con:execute(con_command.." "..def_value) -- записываем значение по умолчанию end end end function dik_numpad0() news_manager.send_tip(db.actor,"нажали кнопку numpad0") end function dik_numpad1() news_manager.send_tip(db.actor,"нажали кнопку numpad1") end function dik_numpad2() news_manager.send_tip(db.actor,"нажали кнопку numpad2") end Далее зайди в bind_stalker.script и найди строчку "function actor_binder:update(delta)". Внутри этой функции вызови твою функцию dik_hot_key.update() Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062596
MJRamon 0 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) @MJRamon, создай файл dik_hot_key.script . В нем напиши: Спасибо. Файл скрипта никак подключать не нужно? Файл запрашивается вызовом одноименной функции? И еще - где взять полный список обозначения клавиш, и можно ли использовать комбинации? Изменено 27 Января 2017 пользователем Eugen81 Не нужно полностью цитировать посты. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062598
dsh 3 824 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Какой смысл задавать ему расстояния ? Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса и в указанном направлении. Если с разных исходных позиций - это значит передача первым параметром разных вертексов, то закономерно, что и результат возвращается разный. Или ты что-то другое имел ввиду? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062599
TIGER_VLAD 361 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) @MJRamon, Достаточно положить файл dik_hot_key.script в папку gamedata\scripts и вызвать его в bind_stalker.script. Полный список(из lua_help.script): const DIK_0 = 11; const DIK_1 = 2; const DIK_2 = 3; const DIK_3 = 4; const DIK_4 = 5; const DIK_5 = 6; const DIK_6 = 7; const DIK_7 = 8; const DIK_8 = 9; const DIK_9 = 10; const DIK_A = 30; const DIK_ADD = 78; const DIK_APOSTROPHE = 40; const DIK_APPS = 221; const DIK_AT = 145; const DIK_AX = 150; const DIK_B = 48; const DIK_BACK = 14; const DIK_BACKSLASH = 43; const DIK_C = 46; const DIK_CAPITAL = 58; const DIK_CIRCUMFLEX = 144; const DIK_COLON = 146; const DIK_COMMA = 51; const DIK_CONVERT = 121; const DIK_D = 32; const DIK_DECIMAL = 83; const DIK_DELETE = 211; const DIK_DIVIDE = 181; const DIK_DOWN = 208; const DIK_E = 18; const DIK_END = 207; const DIK_EQUALS = 13; const DIK_ESCAPE = 1; const DIK_F = 33; const DIK_F1 = 59; const DIK_F10 = 68; const DIK_F11 = 87; const DIK_F12 = 88; const DIK_F13 = 100; const DIK_F14 = 101; const DIK_F15 = 102; const DIK_F2 = 60; const DIK_F3 = 61; const DIK_F4 = 62; const DIK_F5 = 63; const DIK_F6 = 64; const DIK_F7 = 65; const DIK_F8 = 66; const DIK_F9 = 67; const DIK_G = 34; const DIK_GRAVE = 41; const DIK_H = 35; const DIK_HOME = 199; const DIK_I = 23; const DIK_INSERT = 210; const DIK_J = 36; const DIK_K = 37; const DIK_KANA = 112; const DIK_KANJI = 148; const DIK_L = 38; const DIK_LBRACKET = 26; const DIK_LCONTROL = 29; const DIK_LEFT = 203; const DIK_LMENU = 56; const DIK_LSHIFT = 42; const DIK_LWIN = 219; const DIK_M = 50; const DIK_MINUS = 12; const DIK_MULTIPLY = 55; const DIK_N = 49; const DIK_NEXT = 209; const DIK_NOCONVERT = 123; const DIK_NUMLOCK = 69; const DIK_NUMPAD0 = 82; const DIK_NUMPAD1 = 79; const DIK_NUMPAD2 = 80; const DIK_NUMPAD3 = 81; const DIK_NUMPAD4 = 75; const DIK_NUMPAD5 = 76; const DIK_NUMPAD6 = 77; const DIK_NUMPAD7 = 71; const DIK_NUMPAD8 = 72; const DIK_NUMPAD9 = 73; const DIK_NUMPADCOMMA = 179; const DIK_NUMPADENTER = 156; const DIK_NUMPADEQUALS = 141; const DIK_O = 24; const DIK_P = 25; const DIK_PAUSE = 197; const DIK_PERIOD = 52; const DIK_PRIOR = 201; const DIK_Q = 16; const DIK_R = 19; const DIK_RBRACKET = 27; const DIK_RCONTROL = 157; const DIK_RETURN = 28; const DIK_RIGHT = 205; const DIK_RMENU = 184; const DIK_RSHIFT = 54; const DIK_RWIN = 220; const DIK_S = 31; const DIK_SCROLL = 70; const DIK_SEMICOLON = 39; const DIK_SLASH = 53; const DIK_SPACE = 57; const DIK_STOP = 149; const DIK_SUBTRACT = 74; const DIK_SYSRQ = 183; const DIK_T = 20; const DIK_TAB = 15; const DIK_U = 22; const DIK_UNDERLINE = 147; const DIK_UNLABELED = 151; const DIK_UP = 200; const DIK_V = 47; const DIK_W = 17; const DIK_X = 45; const DIK_Y = 21; const DIK_YEN = 125; const DIK_Z = 44; const MOUSE_1 = 256; const MOUSE_2 = 512; const MOUSE_3 = 1024; Изменено 26 Января 2017 пользователем TIGER_VLAD Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062600
Dennis_Chikin 3 664 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса Вот так и не понял: ближний к той, или ближний к этой. То одно, то другое. Вот что мне делать, чтобы получить который не ближе 10, но не дальше 20 метров оттуда, откуда смотрим ? С горя уже начал пробовать высчитать координаты "руками", а потом попросить ближайший доступный. Так и там - то -1, то nil, то 1 откуда-то лезет. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062611
MJRamon 0 Опубликовано 26 Января 2017 Поделиться Опубликовано 26 Января 2017 (изменено) @MJRamon, Достаточно положить файл dik_hot_key.script в папку gamedata\scripts и вызвать его в bind_stalker.script. Спасибо, все прекрасно работает. Однако в итоге вся глобальная идея, которая могла бы оказаться отличным зрелищем, провалилась Дело в том, что все это нужно для стримов, где зритель мог влиять на события: используя программу RutonyChat я отправляю команду на нажатие клавиши в игре. Вот только нажатие клавиш подобным образом срабатывает в любом другом приложении, но не в окне Сталкера. Печально, очень печально. Изменено 27 Января 2017 пользователем Eugen81 Добавлено Eugen81, 27 Января 2017 Правила цитирования. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/410/#findComment-1062614
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти