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/
Nazgool 250 Опубликовано 15 Апреля 2017 Поделиться Опубликовано 15 Апреля 2017 @UnLoaded, О чем вы говорите? Какая универсальная защита? Просто защита конкретной функции. Коих создается великое множество. И лично мне не хочется несколько раз возвращаться к переписыванию одного и того кода по нескольку раз. Поэтому лично я поступил бы именно в таком духе. Ну написал бы несколько вспомогательных функций типа iff(cond, a, - (кодеры поймут что я имел в виду) А насчет "медвежьей услуги". Я посчитал, что если напишу : -- тут что-то делать. лог, вылет, исправить или ничего не делать то, будет достаточно ясно. Видимо ошибался. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077006
UnLoaded 313 Опубликовано 16 Апреля 2017 Поделиться Опубликовано 16 Апреля 2017 Я посчитал, что если напишу : -- тут что-то делать. лог, вылет, исправить или ничего не делать то, будет достаточно ясно. Видимо ошибался. Возьмем вариант с не валидным значением аргумента ф-ции "community". В local data в этом случае получим данные из community = stalker, следовательно код: then return -- тут что-то делать. лог, вылет, исправить или ничего не делатьend никогда не выполнится. Это по Вашему не медвежья услуга ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077077
Nazgool 250 Опубликовано 16 Апреля 2017 Поделиться Опубликовано 16 Апреля 2017 (изменено) @UnLoaded, Нет, это не медвежья услуга, т.к. автор изначально хочет! чтобы при отсутствии значения бралось некое значение по умолчанию ("stalker") Т.е. такое действие не побочный эффект, а сделано намеренно. Вот если бы в исходном коде не было : if community == nil then community = "stalker" end то и я бы написал : ... and community_condition[community] Я всего-лишь подправил код так, чтобы исходная идея автора работала как можно надежнее. Изменено 16 Апреля 2017 пользователем Nazgool Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077104
Space.Marine 466 Опубликовано 18 Апреля 2017 Поделиться Опубликовано 18 Апреля 2017 Подскажите, пожалуйста что делает функция: function k_predicate_s(obj_info) return obj_info.profile_name == "esc_killer_specnaz" end и далее по скрипту: t = { section = "logic@esc_killer1_raid", idle = 0, prior = 8, state = {4}, online = true, predicate = k_predicate_s, in_rest = "", out_rest = "" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077398
UnLoaded 313 Опубликовано 18 Апреля 2017 Поделиться Опубликовано 18 Апреля 2017 что делает функция Так, ты сам уже нашел, что она делает - задает условие принятия неписей на работу в гулаге. Т.е. на эту работу("logic@esc_killer1_raid") будет назначен только тот непись, у которого профиль в конфиге - "esc_killer_specnaz". Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077441
Space.Marine 466 Опубликовано 18 Апреля 2017 Поделиться Опубликовано 18 Апреля 2017 (изменено) Т.е. на эту работу Я так понимаю, будет заспавнен вояка спецназовец во время нападения наймов на деревню новичков ? P.S. Имеется мод (ТЧ Complete). Там, если вынести КПП около деревни новичков, происходит респаун вояк (появляется спецназ). Хотел перенести себе в мод. Сравнивал all.spawn - отличий (по неписям) не нашёл. Единственное в gulag_escape.script отличия по тем строчкам из прошлого поста. Подскажите как реализовать. Изменено 18 Апреля 2017 пользователем Space.Marine Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1077442
h0N0r 382 Опубликовано 22 Апреля 2017 Поделиться Опубликовано 22 Апреля 2017 Понадобилось заспавнить немного лута на локе (сверх того, что расставлено через сдк), но у способа через скрипт (alife():create) есть недостаток - предмет оказывается на ближайшей аи-ноде, что делает невозможным спавнить данным методом на крышах и т.п. В сдк просто - выключил у предмета "used ai locations", и всё нормально. Немного поизучал, что от чего зависит, и в итоге добавил "self:use_ai_locations(false)" в se_item.script (на примере se_eatable (ЗП) - аптечки, еда): function se_eatable:on_register() ... self:use_ai_locations(false) end После этого предмет остаётся в нужных координатах, и остаётся там при сейв / лоаде / онлайн / оффлайн. И всё же в скриптах разбираюсь самую малость, и хотелось узнать от знающих людей - правильное ли такое решение и не будет потом багов? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1078010
UnLoaded 313 Опубликовано 23 Апреля 2017 Поделиться Опубликовано 23 Апреля 2017 правильное ли такое решение и не будет потом багов? Разве не понятно, что таким образом ты отключил привязку к AI-сетке у ВСЕХ "eatable" объектов. Багов скорее всего не будет, не думаю что этот флаг("used ai locations") критичен для "eatable" хлама, но кто его знает что об этом движок думает ? А вообще, на мой взгляд, правильнее будет сбрасывать этот флаг для поля "object_flags"(правкой нет-пакета, вроде доступ к этому полю есть) при спавне конкретного объекта. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1078038
Kirgudu 1 324 Опубликовано 23 Апреля 2017 Поделиться Опубликовано 23 Апреля 2017 (изменено) @h0N0r, выше @UnLoaded правильно написал - абсолютно незачем устанавливать этот флаг сразу для всех объектов определённого типа. Но и в net-пакеты в твоём случае залезать тоже нет необходимости, так как, судя по успешному использованию функции use_ai_locations, делаешь ты это на платформе ЗП. Поэтому используй её и дальше, только не глобально, а сразу после спавна того предмета, для которого ты хочешь отключить привязку к AI-сетке. Примерно так: local s_obj = alife():create(section, position, lvid, gvid, pid) local se_item = alife():object(s_obj.id) se_item:use_ai_locations(false)Можно и через net-пакеты, конечно, но в случае ЗП проще воспользоваться готовой функцией. Изменено 23 Апреля 2017 пользователем Kirgudu 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1078122
UnLoaded 313 Опубликовано 24 Апреля 2017 Поделиться Опубликовано 24 Апреля 2017 Можно и через net-пакеты, конечно, но в случае ЗП проще воспользоваться готовой функцией. Не спорю, ни грамма - если ф-ция работает без дрюканья нет-пакетов. то я только ЗА... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1078241
Dennis_Chikin 3 665 Опубликовано 29 Апреля 2017 Поделиться Опубликовано 29 Апреля 2017 Внезапный такой вопрос: у кого в модах в ПДА накапливается МНОГО выполненных квестов - это у всех при переключении на их показ АДСКИЕ тормоза, или это у меня что-то локальное ? Если не только у меня - кто-то пробовал с этим бороться ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1079045
dsh 3 824 Опубликовано 29 Апреля 2017 Поделиться Опубликовано 29 Апреля 2017 АДСКИЕ тормоза Ну, не сказать, что бы адские, но тормозит, да. кто-то пробовал с этим бороться ? Я решил просто циклические задания, коих больше всего, вынести из заданий вообще. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1079072
TIGER_VLAD 361 Опубликовано 2 Мая 2017 Поделиться Опубликовано 2 Мая 2017 (изменено) Всем привет. Словил себя на том, что много трачу времени на перемещение по локации тестируя что-то. Решил сделать что-то похожее на Noclip режим(режим свободного полета). Код: function noclip_upd() local position = db.actor:position() local direction = device().cam_dir if noclip_active == true then local v = vector() v.x = position.x + direction.x --или просто v= position:add(direction) v.y = position.y + direction.y v.z = position.z + direction.z db.actor:set_actor_position(v) end end Вроде бы все работает, . Но мне так и не удалось изменить скорость полета и еще заметил, что скорость зависит от фпс ( на краях карты скорость больше). Пробовал вектор умножать/делить на delta - получаю очень большую скорость. На delta * 0.001 - получаю Также пробовал изменять длину вектора или сделать длину единичной с помощью методов vector:set_length(n) и vector:normalize() , вот Что подскажете сделать, как решить проблему? Изменено 2 Мая 2017 пользователем TIGER_VLAD 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1080648
naxac 2 578 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 @TIGER_VLAD, может, так? local delta = 0.05 -- подобрать опытным путём: чем больше, тем быстрее function noclip_upd() if noclip_active == true then local position = db.actor:position() local direction = device().cam_dir db.actor:set_actor_position( position:add( direction:mul( delta ) ) ) end end 1 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1080788
trantat 1 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 Кому не сложно, подскажите нубу, как в ЗП получить ID любого предмета, на который указывает игровой курсор, в инвентаре актора или обшариваемого NPC/монстра. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1080978
TIGER_VLAD 361 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 (изменено) @naxac, Да пробовал уже так. Вот так этот код работает . Получается, что ГГ летит не по направлению взгляда ( То есть я например повернул камеру влево/вправо где-то на 20-30 градусов, а направление не меняется, стоит мне повернуть больше и только тогда направление меняется). Думаю сам телепорт(db.actor:set_actor_position) актора нужно как то привязать к аргументу delta метода update, так как скорость телепорта зависит от фпс. На видео видно, что скорость на краях локации сильно увеличивается. local delta = 0.05 -- подобрать опытным путём: чем больше, тем быстрее пробовал от 0.5 - 0.00005 все равно скорость большая Изменено 3 Мая 2017 пользователем TIGER_VLAD Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1081025
dsh 3 824 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 @TIGER_VLAD, ну естественно скорость зависит от фпс, т.е. от частоты выполнения апдейта. Ведь ты же на каждом апдейте меняешь позицию. Умножай дельту на кол-во секунд, прошедших с прошлого апдейта, что-ли. Текущее время в миллисекундах возвращает time_global(). На каждом апдейте его сохрани, вычти из него предыдущее значение, раздели на кол-во миллисекунд в секунде и умножь на дельту. В этом случае, дельтой будет задаваться скорость в секунду реального времени. Как-то так. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1081034
mortan 144 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 @trantat, тебе для этого придётся двигло править, только я не могу понять зачем это может быть нужно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1081213
trantat 1 Опубликовано 3 Мая 2017 Поделиться Опубликовано 3 Мая 2017 @mortan, чтоб можно было разобрать через нет-пакеты свойства любого предмета. К примеру для показа простым наведением курсора какие именно патроны заряжены в конкретный ствол.Мне нужно скриптовое решение, чтобы можно было и для ЧН адаптировать если надо. Правка движка ни разу не универсальный прием. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1081220
Shkiper2012 35 Опубликовано 4 Мая 2017 Поделиться Опубликовано 4 Мая 2017 @TIGER_VLAD, Если используешь движок, где есть коллбэки на нажатие/удержание/отпускание клавиш (например, X-Ray extensions), то можно попробовать так: [spoiler=noclip.script] --[[ ------------------------------------------------------------------------------------------------------- -- File: noclip.script -- Description: Noclip режим (режим свободного полета). --]] ------------------------------------------------------------------------------------------------------- local debug_log = true -- Пишем лог? Да = true / Нет = false local module_init = true local module_name = script_name() local function dbg_logf(fmt,...) if debug_log then log1(fmt,...) end end noclip_active = true -- Вкл. = true / ВЫКЛ. = false local distant_step = 1 -- Кол-во метров, на который смещается камера в режиме NOclip. -- Вкл./ВЫКЛ. режима NOclip. -- function noclip_ON_OFF() if (noclip_active == true) then dbg_logf("~~noclip >>> OFF ") noclip_active = false -- ВЫКЛ.режим бога. -- local console = get_console() console:execute("g_god off") else dbg_logf("--noclip >>> ON ") noclip_active = true -- Вкл.режим бога. -- local console = get_console() console:execute("g_god on") end end -- Коллбэк на удержание клавиши. -- function on_key_hold(key, bind) if (noclip_active == false) then return true end -- kR -- +1 метр к скорости! -- if bind == key_bindings.kWPN_RELOAD then distant_step = distant_step + 1 end -- kT -- -1 метр к скорости! -- if bind == key_bindings.kWPN_FUNC then distant_step = distant_step - 1 if distant_step <= 0 then distant_step = 1 end end -- kW -- Вперед! -- if bind == key_bindings.kFWD then local position = db.actor:position() local direction = device().cam_dir db.actor:set_actor_position(position:mad(direction, distant_step)) end -- kS -- Назад! -- if bind == key_bindings.kBACK then local position = db.actor:position() local direction = device().cam_dir db.actor:set_actor_position(position:mad(direction, (-distant_step))) end -- kA -- Стрейф влево! -- if bind == key_bindings.kL_STRAFE then local position = db.actor:position() local direction = device().cam_right db.actor:set_actor_position(position:mad(direction, (-distant_step))) end -- kD -- Стрейф вправо! -- if bind == key_bindings.kR_STRAFE then local position = db.actor:position() local direction = device().cam_right db.actor:set_actor_position(position:mad(direction, distant_step)) end -- kSpace -- Наверх! -- if bind == key_bindings.kJUMP then local position = db.actor:position() local direction = device().cam_top db.actor:set_actor_position(position:mad(direction, distant_step)) end -- Left SHIFT -- Вниз! -- if bind == key_bindings.kCROUCH_TOGGLE then local position = db.actor:position() local direction = device().cam_top db.actor:set_actor_position(position:mad(direction, (-distant_step))) end end if module_init then dbg_logf("**DBG: LOADING MODULE: "..module_name..".script -- Ok. ") end Во время режима NOclip я включаю режим бога, чтоб гг не застрелили пока он летит до пункта назначения. Клавишами R(по-умолчанию "Перезарядка") и T(у меня это = "Переключение на подствольник") регулирую скорость (а точнее, кол-во метров на которое смещается камера). Клавиши: W,A,S,D - управление как обычно. 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/421/#findComment-1081579
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти