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 Ссылка на комментарий
AndrewMor 533 Опубликовано 5 Мая 2019 Поделиться Опубликовано 5 Мая 2019 (изменено) 14 часов назад, _Sk8_AsTeR_ сказал: Так вот, там многих, так сказать, бочек с кострами нету. Каким образом можно получить название лагеря? Надеюсь правильно вопрос задал. Думаю, надо изменить код так, чтобы название смарт-террейна вообще не фигурировало в скрипте. Указывать только flame = "zone_flame_small_0001", light = "lights_camp_fire_omni_r1_r2_0001", а их названия взять из распакованного спавна. Изменено 5 Мая 2019 пользователем AndrewMor Ссылка на комментарий
naxac 2571 Опубликовано 5 Мая 2019 Поделиться Опубликовано 5 Мая 2019 @Norman Eisenherz, @Fenrir02 верно говорит - исключи из цикла актера, начинай перебирать с 1 for i = 1, 65534 do... 1 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 5 Мая 2019 Поделиться Опубликовано 5 Мая 2019 @naxac Просмотрел, что кроме шага еще и отсчет с 1 начинается. В таком виде работает даже без задержки запуска. Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 10 Мая 2019 Поделиться Опубликовано 10 Мая 2019 Здрасьте. Сделал иконку состояния брони (набор статиков) с вызовом из function actor_binder:update(delta): на двух старых сейвах статик загружается и успешно работает, еще примерно на 10 старых сейвах и в новой игре не загружается, а при попытке сохранения и перезагрузки игры приводит к вылету с одним из двух приведенных ниже сообщений. Методом исключения удалось выяснить, что статикам мешает работать уборщик – мешает даже не перебором объектов на сервере, а конкретно той частью, которая удаляет бесхозное оружие. Добавил к запуску уборщика условие if device().precache_frame <= 1 – проблема разрешилась, но все-таки хочется знать, что вызывало эту проблему. ТЧ 1.0006, без глобальных модов. https://drive.google.com/open?id=1Yp4s8CvySYUsv0j2EolZYWdAan0JHsfN Spoiler Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:411: attempt to concatenate field '?' (a nil value) для справки – указанная строка [bind_stalker.script] (с модами): get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...alker shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Ссылка на комментарий
naxac 2571 Опубликовано 10 Мая 2019 Поделиться Опубликовано 10 Мая 2019 @Norman Eisenherz, это у тебя где-то что-то виснет в биндере актера, и потом бьётся сохранение. Загружая его, получаешь этот вылет. Ссылка на комментарий
_g.script 3656 Опубликовано 10 Мая 2019 Поделиться Опубликовано 10 Мая 2019 6 часов назад, Norman Eisenherz сказал: attempt to concatenate field '?' naxac дело говорит, я ловил такую дрянь, в другой ситуации. Тогда у меня нет-пакет портился из-за негодной адаптации, а я то думал, что там с загрузкой моего difficulty... Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 10 Мая 2019 Поделиться Опубликовано 10 Мая 2019 @naxac Можно ли подробнее? Куда копать? Потестил еще: условие precache_frame привело к тому, что теперь уборщик не срабатывает на текущей локации. @mole venomous Нет-пакеты я точно не трогал. Ссылка на комментарий
naxac 2571 Опубликовано 11 Мая 2019 Поделиться Опубликовано 11 Мая 2019 (изменено) @Norman Eisenherz, вот в этом цикле for j = 1, #bodies do if del.position:distance_to(bodies[j].position) > 5 then alife():release(del) end end добавь break при успешном удалении, иначе попытается удалить несколько раз подряд. Возможно, из-за этого и зависает иногда. Изменено 11 Мая 2019 пользователем naxac Ссылка на комментарий
AndreySol 215 Опубликовано 11 Мая 2019 Поделиться Опубликовано 11 Мая 2019 (изменено) @Norman Eisenherz Вот этоl local act = db.actor стоит перенести из глобальной области скрипта в функцию, где объект актера используется. Изменено 11 Мая 2019 пользователем AndreySol 1 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 12 Мая 2019 Поделиться Опубликовано 12 Мая 2019 @naxac Проверил еще раз уборщик – старая логика действительно должна была сбоить: проверяется расстояние до 1-го трупа из списка, объект (возможно) удаляется, потом проверяется расстояние от этого же объекта до 2-го, 3-го трупа и т. д., и тот же объект снова удаляется (по крайней мере, делается такая попытка). Оператор break можно поставить только на негативное условие: если при переборе расстояний найдено значение меньше 5 , то закончить перебор для данного объекта и перейти к следующему, в противном случае удалить объект и перейти к следующему. Не до конца понимаю, как это правильно оформить, чтобы проверка не стопорилась на первом же значении > 5. Пошел другим путем: создать таблицу расстояний от текущего объекта до всех трупов, взять минимум, сравнить его с заданной величиной (5) и удалить, если этот минимум больше. Spoiler if next(wpn_near) ~= 0 then for i = 1, #wpn_near do local del = wpn_near[i] if del.position:distance_to(act:position()) > 10 then if next(bodies) ~= 0 then local distance = {} for j = 1, #bodies do local dist = del.position:distance_to(bodies[j].position) table.insert(distance, dist) end table.sort(distance) if distance[1] > 5 then alife():release(del) end else alife():release(del) end end end end @AndreySol Если функций несколько, лучше обозначать такие переменные в каждой из них или в общей области? Ссылка на комментарий
WinCap 323 Опубликовано 12 Мая 2019 Поделиться Опубликовано 12 Мая 2019 @Norman Eisenherz, на мой взгляд - сильно "замудрил". Попробуй так: for k, wpn in pairs(wpn_near)do if wpn.position:distance_to(act:position()) > 10 then if #bodies ~= 0 then for k, bod in pairs(bodies) do if wpn.position:distance_to(bod.position) > 5 then alife():release(wpn) break end end else alife():release(wpn) end end end Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 12 Мая 2019 Поделиться Опубликовано 12 Мая 2019 @WinCap Кроме способа перебора (ну и еще остановки), это опять старая логика: "если до первого трупа в списке > 5 метров, то удалить оружие". Должно быть "если до всех трупов на локации > 5 метров, тогда удалять". Ссылка на комментарий
WinCap 323 Опубликовано 12 Мая 2019 Поделиться Опубликовано 12 Мая 2019 @Norman Eisenherz, тогда так: if #bodies ~= 0 then local del = true for k, bod in pairs(bodies) do if wpn.position:distance_to(bod.position) < 5 then del = false break end end if del then alife():release(wpn) end else 1 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 20 Мая 2019 Поделиться Опубликовано 20 Мая 2019 Здрасьте. Можно ли без правок движка изменить формат счетчика оставшегося времени для заданий? Единственный подходящий файл – [scripts\ask_manager.script], но сообщения в явном виде или его фрагментов (ui_st_time_remains, ui_st_days и ui_st_hours) в нем нет, как и ссылки на блок rem_time из файла [config\ui\job_item.xml]. Ссылка на комментарий
Полтергейст 38 Опубликовано 21 Мая 2019 Поделиться Опубликовано 21 Мая 2019 А никто ещё не переписывал скрипт class_registrator так, чтобы в нем хранились все таблицы с данными для регистрации классов и классификации объектов? В оригинале данные просто используются один раз при старте игры и не хранятся нигде, что неудобно. Ссылка на комментарий
AndreySol 215 Опубликовано 22 Мая 2019 Поделиться Опубликовано 22 Мая 2019 @Полтергейст А что ты в этих таблицах собираешься хранить, полезного для исп. в скриптах ? Ссылка на комментарий
Полтергейст 38 Опубликовано 22 Мая 2019 Поделиться Опубликовано 22 Мая 2019 @AndreySol, данные, необходимые для любых функций классификации (IsMonster и тому подобных). Туда же можно сохранить значение stype (modules.stype_чтонибудь). Да много всего можно там хранить, чтобы каждый раз не делать свою табличку для классификации. Ссылка на комментарий
AndreySol 215 Опубликовано 22 Мая 2019 Поделиться Опубликовано 22 Мая 2019 6 часов назад, Полтергейст сказал: IsMonster Ну так эта ф-ция объявлена в _G.script, тебе очень хочется иметь ее в класс_регистратор ? И какой с этого профит ? Ссылка на комментарий
Полтергейст 38 Опубликовано 22 Мая 2019 Поделиться Опубликовано 22 Мая 2019 @AndreySol, я про таблицы значений clsid, на которых эти функции работают. Неудобно, когда они разбросаны по куче разных файлов. Лучше иметь одну большую таблицу, где всё это собрано. Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 28 Мая 2019 Поделиться Опубликовано 28 Мая 2019 Здрасьте. Делаю счетчик хилок на HUD: создал группу скриптовых статиков, вывел через get_hud():AddDialogToRender(…) и записал в таблицу, чтобы статики не потерялись при уборке. Проблема: если добавлять статики в таблицу через table.insert, то индексы получаются просто числами, и найти среди них нужный статик (для привязки текста или для удаления статика, если каких-то предметов 0) невозможно. Если добавлять статики в таблицу по секции предмета list[sect] = static, то случается безлоговый вылет через секунду после загрузки – так же, как при отсутствии хранения ссылок на статики. Что я упускаю? Мой мод и оригинал счетчика: https://drive.google.com/open?id=16gX0BYqim6zB6aZnGLqSV-kMPMB3QjQC Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти