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/
AndreySol 215 Опубликовано 10 Июля 2021 Поделиться Опубликовано 10 Июля 2021 @Rod_K Как уже посоветовал dsh, для оригинального движка - спавн на позиции актера LC, с требуемыми настройками. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389517
Rod_K 1 Опубликовано 10 Июля 2021 Поделиться Опубликовано 10 Июля 2021 В дополнение к теме телепорта на другую локацию. Значит я через acdc скомпилировал спавн, в который добавил новую локацию (пещера из солянки). Нужно сделать так, чтобы после диалога спавн происходил именно на этой локации (пещера). Сейчас имею ровно обратную картину: актор телепортируется на другую точку кордона, а все обьекты из локации "пещера" спавнятся на кордоне. Понимаю, что проблема в вертексах, но я забыл в каком из файлов можно перераспределить эти вертексы и нормально осуществить переход. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389589
_g.script 3 667 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 (изменено) @Rod_K Что бы не потрошить спаун, воспользуйся скриптовым ЛЧ. Если новая локация добавлена без косяков, всё отработает хорошо. Под спойлером ф-ии спавна и удаления ЛЧ. Для примера - телепорт в комнату Бармена. Вызываешь спавн/удаление в удобных тебе местах. Скрытый текст -- Аргумент info для фикса телепортации Кордон-ТД function start_level_changer(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level, info) -- Перед созданием ЛЧ выдём инфо, если необходимо if info ~= nil then if not has_alife_info(info) then db.actor:give_info_portion(info) end end local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) local packet = net_packet() obj:STATE_Write(packet) -- свойства cse_alife_object local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_u32() local level_vertex_id = packet:r_u32() local object_flags = packet:r_u32() local custom_data = packet:r_stringZ() local story_id = packet:r_u32() local spawn_story_id = packet:r_u32() -- свойства cse_shape local shape_count = packet:r_u8() for i = 1, shape_count do local shape_type = packet:r_u8() if shape_type == 0 then -- sphere local center = packet:r_vec3() local radius = packet:r_float() else -- box local axis_x = packet:r_vec3() local axis_y = packet:r_vec3() local axis_z = packet:r_vec3() local offset = packet:r_vec3() end end -- свойства cse_alife_space_restrictor local restrictor_type = packet:r_u8() -- свойства cse_alife_level_changer local dest_game_vertex_id = packet:r_u16() local dest_level_vertex_id = packet:r_u32() local dest_position = packet:r_vec3() local dest_direction = packet:r_vec3() local dest_level_name = packet:r_stringZ() local dest_graph_point = packet:r_stringZ() local silent_mode = packet:r_u8() packet:w_begin(game_vertex_id) packet:w_float(distance) packet:w_u32(direct_control) packet:w_u32(level_vertex_id) packet:w_u32( bit_not(193) ) packet:w_stringZ(custom_data) packet:w_u32(46489) packet:w_u32(46489) packet:w_u8(1) packet:w_u8(0) packet:w_vec3(vector():set(0, 0, 0)) packet:w_float(2) packet:w_u8(3) packet:w_u16(p_dest_gv) packet:w_u32(p_dest_lv) packet:w_vec3(p_dest_pos) packet:w_vec3(vector():set(0, 0, 0)) packet:w_stringZ(p_dest_level) packet:w_stringZ("start_actor_99") packet:w_u8(1) packet:r_seek(0) obj:STATE_Read(packet, packet:w_tell()) end local disposition function teleport_bar_vip_room() disposition = vector():set(114.89195251465,-5.3071584701538,14.840103149414) if level.name()~="l05_bar" then start_level_changer(disposition, 33615, 1239, "l05_bar") else db.actor:set_actor_position(disposition) end end function Del_LevelChanger() local LV = alife():story_object(46489) if LV then alife():release(LV, true) end end Изменено 11 Июля 2021 пользователем mole venomous 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389590
dsh 3 824 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 Я в очередной раз напомню, что вот так, как в выше приведённом примере, делать не нужно. Не нужно закатывать солнце в ручную, нужно использовать m_netpk. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389605
phalcor 60 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 Столкнулся со странной загадкой в плане кондишена оружия. Пример: имеем у себя любое оружие - my_wpn. Загружаем игру. СТРЕЛЯЕМ из него несколько раз, чтобы подпортить его кондишн. Берём клиентский объект этого оружия (у примеру у нас автомат в слоте): cl_wpn = db.actor:item_in_slot(inventory_slots.RIFLE) Читаем кондишн: cl_cond=cl_wpn:condition() -- получаем 0.80 (к примеру) берём серверный объект: s_wpn = server_object(cl_wpn:id()) вычисляем его кондишн: local pk = m_netpk.get(s_wpn, 1) local data = pk:get() local s_cond=data.condition получаем 0.81 (!) ИМЕЕМ РАЗНИЦУ (доходит до ~ 0,15%). То есть серверный объект имеет кондицию, как будто из него не стреляли. Правим вручную серверную кондицию, приводя её к величине клиентской: data.condition=cl_cond pk:set(data) Если теперь снова прочитать клиентскую и серверную кондиции, то они будут равны! НО! Сохраняем игру и тут же загружаем. Читаем кондиции. И снова имеем эту разницу (уже не стреляя), КАК БУДТО МЫ НЕ МЕНЯЛИ СЕРВЕРНУЮ КОНДИЦИЮ! Извините за многобукв, постарался попонятнее. Кто-то может оъяснить, почему так происходит, и как это укротить (чтобы если я менял серверную кондицию, она реально менялась)? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389606
dsh 3 824 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 @phalcor если я не ошибаюсь, у тебя ОП-2.1, в котором собственный движок и исходников его нет. Кто знает, что они там наворотили. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389609
phalcor 60 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 @dsh Да, именно ОП 2.1. Значит, как я понял, это именно её, опы, частная проблема, и на прочих платформах такого нет? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389612
Bak 757 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 @phalcor Дело в том, что движок передает (от клиентского объекта к серверному), и сохраняет в сейве состояние через апдейт пакет в сжатом виде (u8, то есть всего 256 позиций). Отсюда и погрешность. И касается это любой версии движка, кроме тех, конечно, где это специально исправлялось. В качестве решения можно завести собственный скриптовый метод сохранения состояния. 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389613
phalcor 60 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 4 минуты назад, Bak сказал(а): В качестве решения можно завести собственный скриптовый метод сохранения состояния. Ну да, сделал я скриптовые костылики: при сохранении формирую табличку кондиций оружия актора, а при load - применяю её. Или есть способ элегантней? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389614
Zander_driver 10 348 Опубликовано 11 Июля 2021 Поделиться Опубликовано 11 Июля 2021 19 минут назад, phalcor сказал(а): есть способ элегантней? Более элегантные способы как правило требуют исходников движка. Но они конечно есть.. 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389616
Капрал Хикс 561 Опубликовано 13 Июля 2021 Поделиться Опубликовано 13 Июля 2021 Не нахожу поиском или туплю. В ТЧ есть скриптовый метод проверки ГГ на кровотечение? Задумал тут перетащить медиков из ЗП... if db.actor.bleeding > 0 then -такая проверка вообще возможна в ТЧ? Ну и сам скрипт лечения: function medic_magic_potion(first_speaker, second_speaker) db.actor.health = 1 db.actor.power = 1 db.actor.radiation = -1 db.actor.bleeding = 1 end Будет ли работать в ТЧ? Где подсмотреть? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389794
Zander_driver 10 348 Опубликовано 13 Июля 2021 Поделиться Опубликовано 13 Июля 2021 (изменено) Только что, Капрал Хикс сказал(а): Будет ли работать в ТЧ? Без правок движка - нет, не будет. Только что, Капрал Хикс сказал(а): db.actor.bleeding = 1 Потому что нет такого на запись, в оригинальном ТЧ. На чтение тоже несколько иначе. db.actor:get_bleeding() возвращает float от 0 до... существенно более единицы возможно. Изменено 13 Июля 2021 пользователем Zander_driver 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389798
AndreySol 215 Опубликовано 13 Июля 2021 Поделиться Опубликовано 13 Июля 2021 23 минуты назад, Капрал Хикс сказал(а): db.actor.bleeding Нет такого свойства. Да и зачем тебе именно кровотечение, попробуй bool wounded() -- состояние ранености void wounded(boolean) -- изменить состояние ранености В движке не ковырял, но уверен что состояние ранения напрямую привязано к кровотечению. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389799
Zander_driver 10 348 Опубликовано 13 Июля 2021 Поделиться Опубликовано 13 Июля 2021 А это ничего, что "раненность" изменяется в диапазоне несколько более сложном, чем "вкл/выкл" ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389801
AndreySol 215 Опубликовано 13 Июля 2021 Поделиться Опубликовано 13 Июля 2021 @Капрал Хикс Проверил, у меня на 1.0007(rc1) wounded() всегда возвращает false. Т.ч. не подойдет и это, правка движка нужна. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389828
Капрал Хикс 561 Опубликовано 14 Июля 2021 Поделиться Опубликовано 14 Июля 2021 (изменено) @AndreySol @Zander_driver , я тут поразмыслил, и понял, что лучше всего использовать банальную проверку на состояние здоровья ГГ <1.0 (ну и радиации). Ведь если у ГГ есть кровотечение, то здоровье всё равно будет ниже единицы? А насчёт записи состояния кровотечения - в x-ray extension вроде добавлен метод: // CEntityAlive heal_wounds(float) Кстати, в R.M.A. по идее он должен работать, только как правильно вызвать функцию остановки кровотечения? Изменено 14 Июля 2021 пользователем Капрал Хикс Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389913
AndreySol 215 Опубликовано 14 Июля 2021 Поделиться Опубликовано 14 Июля 2021 2 часа назад, Капрал Хикс сказал(а): то здоровье всё равно будет ниже единицы? Например от голода - разве это признак ранения? Костыли, скорее всего, не помогут, а что там в x-ray extension накрутили - надо в описании и читать. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389939
Капрал Хикс 561 Опубликовано 14 Июля 2021 Поделиться Опубликовано 14 Июля 2021 12 минут назад, AndreySol сказал(а): Например от голода - разве это признак ранения? Мне всё равно нужен универсальный метод проверки, нуждается ли ГГ в лечении. Неважно, от чего здоровье будет ниже единицы. 15 минут назад, AndreySol сказал(а): что там в x-ray extension накрутили - надо в описании и читать. // CEntityAlive heal_wounds(float) - там вот так и описано, что-де добавлен метод такой. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1389945
phalcor 60 Опубликовано 15 Июля 2021 Поделиться Опубликовано 15 Июля 2021 Решил сделать горячие кнопки на установку/снятие глушителя для оружия в активном слоте. Снятие сделал. Глушитель снимается и оказывается в инвентаре. Condition его при этом сохраняется. В очень усечённом виде это выглядит так: local w = db.actor:active_item() --активный ствол local w_sect=w:section() if w:has_silencer() then local addon_sect=w:detach_silencer(true) --ph: false - снятый глушитель исчезает, true - попадает в инвентарь end Установка: а вот тут возникла проблемка. Имеется такой метод установки глушителя: weapon:attach_silencer(sil) --здесь sil - имя секции глушителя. При этом устанавливается вновь заспавненный глушитель. Мне же нужно или - 1) брать уже имеющийся из инвентаря или - 2) менять condition на установленном указанным выше методом, а из инвентаря соответственно просто удалять Есть ли методы для вариантов 1 или 2? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1390057
naxac 2 578 Опубликовано 17 Июля 2021 Поделиться Опубликовано 17 Июля 2021 @phalcor , что за движок? В ванильном нет ни has, ни detach, ни attach_silencer 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/568/#findComment-1390251
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти