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/
Larry76 0 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 Всем здравствуйте! Изъюзал весь поиск,но так и не нашёл ответа на,казалось бы простой вопрос: Что такое мины?Как их спаунить? Какие конфиги за них отвечают. Я имею ввиду простые стационарные мины,спавнящиеся с началом игры. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453433
DiXares 1 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 Larry76, простые мины палочкой вверх? Если да, то это аномалии такие, типа мины. В состоянии idle имеют партикл палочки, а в активном состоянии, когда актор вошёл в зону мины, активное, тоесть хит и партикл взрыва, звук. Спавнить их в sdk или all.spawn, или скриптом. Также спавнить, как и аномалии. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453441
Larry76 0 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 (изменено) TREWKO.А поподробнее, с примером? Я,в принципе понял,что они действуют наподобии аномалий.Но вот примерчик спавна одиночной мины не помешал бы конечно... Интересно,а в Сигерусе мины как сделаны? (те,которые с началом игры по локации разбросаны.) Изменено 12 Июня 2010 пользователем Larry76 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453461
rnm_016 54 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 Здрасьте. Хотел бы узнать, как спаунить непися на определенной локации (желательно торговца) к примеру на свалке. И через какой инфопоршень его желательно вызывать? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453464
DiXares 1 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 (изменено) Как можно сделать не большую зону, пр наведении на которую курсор будет надпись и при нажатии кнопки действия мы получим функцию. Добавлено через 14 мин.: Larry76, спавнятся как и аномалии. Скриптом я аномалии так и не научился спавнить, скрипт у меня не пашет. Секция мины = zone_mine_field Но вот: function create_anom(section,rad_anom,x,y,z,lv,gv,mode) -- con(section) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end if pos==nil then pos=db.actor:position() end local p_obj = alife():create(section,vector():set(x,y,z),lv,gv) local packet = net_packet() packet:w_begin(0) p_obj:STATE_Write(packet) packet:r_seek(2) local game_vertex_id = packet:r_u16() local cse_alife_object__unk1_f32 = packet:r_float() local cse_alife_object__unk2_u32 = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local cse_alife_object__unk3_u32 = packet:r_s32() local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local cse_alife_custom_zone__unk1_f32 = packet:r_float() local cse_alife_custom_zone__unk2_u32 = packet:r_s32() local on_off_mode_enabled_time = packet:r_s32() local on_off_mode_disabled_time = packet:r_s32() local on_off_mode_shift_time = packet:r_s32() local offline_interactive_radius = packet:r_float() local artefact_spawn_places_count = packet:r_u16() local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32() local last_spawn_time_present = packet:r_u8() -- if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end packet:w_u16(game_vertex_id) packet:w_float(cse_alife_object__unk1_f32) packet:w_s32(cse_alife_object__unk2_u32) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) if mode~=nil then custom_data = mode end packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(cse_alife_object__unk3_u32) packet:w_u8(1) packet:w_u8(0) local sphere_center = vector() sphere_center:set(0, 0, 0) packet:w_vec3(sphere_center) radius = rad_anom packet:w_float(radius) packet:w_u8(restrictor_type) packet:w_float(cse_alife_custom_zone__unk1_f32) cse_alife_custom_zone__unk2_u32 = bit_not(0) packet:w_s32(cse_alife_custom_zone__unk2_u32) packet:w_s32(on_off_mode_enabled_time) packet:w_s32(on_off_mode_disabled_time) packet:w_s32(on_off_mode_shift_time) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_places_count) packet:w_s32(cse_alife_anomalous_zone__unk1_u32) if mode == nil then packet:w_u8(last_spawn_time_present) end p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) -- add_spot_on_map(p_obj.id,"red_location","Аномалия") return p_obj end Вызвать так: Ниже этого скрипта пиши: function anm_cr() create_anom("zone_mine_field",radius,x,y,z,lv,gv, nil) -- пропиши координаты и радиус. end Сам толком не проверял. Изменено 12 Июня 2010 пользователем TREWKO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453477
iDreD 5 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 ~<Red>~, function spawn_vintorez() alife():create("имя_нпс_из_файла_character_descr_***",vector():set(-179.04676818848,9.4119186401367,76.59033203125),582891,145) end Где *** имя локации. (-179.04676818848,9.4119186401367,76.59033203125),582891,145) Координаты. В нашём случае спаун на затоне в одном из домов сгоревшего хутора. И через какой инфопоршень его желательно вызывать?Хм... Это как? Вызвать функцию можешь из диалога тегом <action>имя_скрипта.имя_функции_спауна</action> Всё. ЗЫ: И вот это прочти. Много нового узнаешь. Добавлено через 5 мин.: А как удалить предмет из инвентаря скриптом? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453489
меченый(стрелок) 5 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 Как и любой другой объект в игре . в цикле по инвентарю ищешь название и удаляешь по id либо просто отбираешь у игрока (посмотри в сторону dialogs.script или amk_mod.script) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453497
Гость max_max_08 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 alife():create("имя_нпс_из_файла_character_descr_***",vector():set Насколько я знаю секция берется из спавн_секции, а не из character_descr_*** Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453522
iDreD 5 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 А, да, сори, опечатка . Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453535
rnm_016 54 Опубликовано 12 Июня 2010 Поделиться Опубликовано 12 Июня 2010 а тогда как? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-453656
ZeeK 62 Опубликовано 13 Июня 2010 Поделиться Опубликовано 13 Июня 2010 Здрасте народ! Никто не подскажет возможен ли какой нибудь счетчик диалогов? Например если один и тот же диалог например прошел 3 раза то чего нибудь делаем... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454070
sapsan 337 Опубликовано 13 Июня 2010 Поделиться Опубликовано 13 Июня 2010 (изменено) Подскажите, кто знает: 1. как узнать использован ли в данный момент оптический прицел главным героем ? 2. как убрать/вернуть весь индикаторный худ как по клавишам "серый минус"/"серый плюс" ? malandrinus, это для ТЧ. 1. оружие с оптическим прицелом в состоянии прицеливания. 2. level.hide_indicators()/level.show_indicators() эквивалентны -/+, hud_weapon on/off убирает руки с оружием, hud_info on/off не заметил изменений на экране, а остальное не пробовал из-за ненадобности. Изменено 14 Июня 2010 пользователем sapsan Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454163
Malandrinus 615 Опубликовано 14 Июня 2010 Поделиться Опубликовано 14 Июня 2010 Никто не подскажет возможен ли какой нибудь счетчик диалогов? В диалогах можно завести тег action. Вписываешь туда свою функцию и делаешь там что надо. Можно и счётчик завести. 1. как узнать использован ли в данный момент оптический прицел главным героем ? 2. как убрать/вернуть весь индикаторный худ как по клавишам "серый минус"/"серый плюс" ? 1. Уточнить бы вопрос. Надет прицел на текущем оружии или оружие в состоянии прицеливания? Если установленность прицела, то в ТЧ это только через нетпакеты. Начиная с ЧН есть вроде функция у ствола weapon_is_scope 2. Для манипуляции элементами худа можно использовать консольные команды (через get_console():execute()): hud_crosshair on/off hud_crosshair_dist on/off hud_info on/off hud_weapon on/off и функции: level.hide_indicators() level.show_indicators() Что из этого заменяет +/- уже не помню. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454184
iDreD 5 Опубликовано 14 Июня 2010 Поделиться Опубликовано 14 Июня 2010 Подскажите пожалуйста, АМК таймеры от ТЧ подойдут к ЗП? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454297
Министр 4 Опубликовано 14 Июня 2010 Поделиться Опубликовано 14 Июня 2010 кровоSTALKER, а почему не пойдут-то? Это всего лишь проверка времени (с последствиями в виде запуска нужных событий) повешенная на апдейт актора. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454383
ФеНиКс 2 Опубликовано 15 Июня 2010 Поделиться Опубликовано 15 Июня 2010 Как сделать чтобы при подходе ГГ к НПС с определенным SIDом ближе чем на 10метров его(ГГ) бил хит(слабенький) + постэффект и появлялось сообщение что ближе мол нельзя убьёт. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454835
DiXares 1 Опубликовано 15 Июня 2010 Поделиться Опубликовано 15 Июня 2010 (изменено) ФеНиКс: Впервые я могу что-то предложить: Ну во-первых тебе надо сделать проверку на дистанцию: local flobals = false function bind_hit_static() for a=1,65635,1 do local obj=level.object_by_id(a) if obj and string.find(obj:name(),"имя нпс") and not flobals then if obj:position():distance_to(db.actor:position()) < 10 then local h = hit (); h.power = 1; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; obj:hit (h); flobals = true end end end end Вот мы и получили хит... по моему))) Теперь надо сделать сообщение, получаем такое: local flobals = false function bind_hit_static() for a=1,65635,1 do local npc=level.object_by_id(a) if npc and string.find(npc:name(),"имя нпс") and not flobals then if npc:position():distance_to(db.actor:position()) < 10 then local h = hit (); h.power = 1; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; npc:hit (h); flobals = true local sactor = alife():actor() local cactor = level.object_by_id(sactor.id) cactor:give_game_news( "%c[255,255,1,1]Имя того, кто это скажет\\n%c[255,1,255,1]Дальше подойти нельзя! Опасная зона!", "ui\\ui_iconstotal", Frect():set(1245,517,83,47), math.random(1000, 2000), -- задержка появления сообщения. корейский рандом))) 5000 -- сколько продержится это сообщение. ) end end end end Но вот я не понял, эффект какой, пост эффект? Или аним? К сожалению не врубился, как прописать sid... Может: level.object_by_sid(номер сида)? Кстати: Засунул в скрипт test.script это: local lamps_marsh_vr_on = false function bind() local id, obj for id=0, 65535 do obj = level.object_by_id(id) if obj ~= nil and obj:section() == "lights_hanging_lamp" and string.find(obj:name(), "light_alarm_glass_0001") then local hl = obj:get_hanging_lamp() if hl ~= nil then if lamps_marsh_vr_on then hl:turn_on() else hl:turn_off() end end end end end Прописал в биндер сталка: test.bind() То есть, при запуске игры выключается лампочка в подвале у сидора. Но как только запускаю игру, игра идёт нормально... как только сидор махнул рукой - бац вылет! Вылет без лога. Удаляю скрипт--> игра работает без проблем. Результат выключения лампочки увидеть не могу, так как слишком быстро всё происходит. Изменено 15 Июня 2010 пользователем TREWKO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454840
sapsan 337 Опубликовано 15 Июня 2010 Поделиться Опубликовано 15 Июня 2010 (изменено) Ещё вопрос по худу - как узнать был ли убран худ пользователём с помощью "-"? Если нет явного способа, то можно ли сделать это неявно - проверкой наличия какого-то стандартного элемента худа (например миникарты)? Проверил с помощью проверки на наличие часов: get_hud():GetCustomStatic("hud_show_time") так они всегда присутствуют... malandrinus, а сам элемент есть такой ? "hud_show_time" - это в Солянке часы выводятся... Код local guiHidedManually = not cs get_console():execute("load ~#I#: guiHidedManually="..tostring(guiHidedManually)) get_console():execute("load ~#I#: cs:wnd():IsEnabled()="..tostring(cs:wnd():IsEnabled())) get_console():execute("load ~#I#: cs:wnd():IsShown()="..tostring(cs:wnd():IsShown())) get_console():execute("load ~#I#: cs:wnd():GetWidth()="..tostring(cs:wnd():GetWidth())) get_console():execute("load ~#I#: cs:wnd():GetHeight()="..tostring(cs:wnd():GetHeight())) get_console():execute("load ~#I#: cs:wnd():GetTextX()="..tostring(cs:wnd():GetTextX())) get_console():execute("load ~#I#: cs:wnd():GetTextY()="..tostring(cs:wnd():GetTextY())) всегда возвращает: ! Cannot find saved game ~#i#: guihidedmanually=false ! Cannot find saved game ~#i#: cs:wnd():isenabled()=true ! Cannot find saved game ~#i#: cs:wnd():isshown()=true ! Cannot find saved game ~#i#: cs:wnd():getwidth()=98 ! Cannot find saved game ~#i#: cs:wnd():getheight()=19 ! Cannot find saved game ~#i#: cs:wnd():gettextx()=22 ! Cannot find saved game ~#i#: cs:wnd():gettexty()=1 Изменено 16 Июня 2010 пользователем sapsan Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454907
Malandrinus 615 Опубликовано 16 Июня 2010 Поделиться Опубликовано 16 Июня 2010 sapsan, странно, у меня эта же проверка стабильно выдаёт nil. Но если есть статик, то можно попытаться проверить видимость или положение окна, связанного с ним. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454935
Gektor 0 Опубликовано 16 Июня 2010 Поделиться Опубликовано 16 Июня 2010 Привет всем. Люди добрые, подскажите мне пожайлуста как прикрутить аномалию(например - электра) к конкретному объекту(например - бочка с бензином)? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/29/#findComment-454985
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти