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 Ссылка на комментарий
Nazgool 250 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 @TIGER_VLAD, Да там всё просто. На родительское окно лепишь статик с фоном бара (напр. красный) и задаешь ему позицию "Х" равную -(минус)ширина_бара Т.е. изначально оно скрыто (скажем). По мере надобности меняем "Х" и двигаем этот дочерний статик относительно родительского так как нужно. То что выходит за пределы родителя видно не будет, а то что будет видно на родителе, то и будет тебе прогресс баром Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 @FonSwong, @Nazgool, Можно пример кода? Ссылка на комментарий
UnLoaded 313 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 (изменено) Карлан писал(а): прогресс-бар в ТЧ работает, конкретно вопрошающему необходим SetWndPos Ну наверное ему нужно все-же SetProgressPos, если разговор о прогресс-баре. TIGER_VLAD писал(а): Можно пример кода? Ну примерно так: local inv_main = level:main_input_receiver() if inv_main then local inv_xml = CScriptXmlInit() inv_xml:ParseFile("какой-то_файл.xml") -- парсим файл с описанием элементов -- local pb_new = inv_xml:InitProgressBar("конкретный_элемент", inv_main) pb_new:SetAutoDelete(true) pb_new:Show(true) endlocal inv_main = level:main_input_receiver() if inv_main then local inv_xml = CScriptXmlInit() inv_xml:ParseFile("какой-то_файл.xml") -- парсим файл с описанием элементов -- local pb_new = inv_xml:InitProgressBar("конкретный_элемент", inv_main) pb_new:SetAutoDelete(true) pb_new:Show(true) end затем pb_new:SetProgressPos(нужное значение) какой-то_файл.xml создать по аналогии с другими в папке config\ui. Для прогресс-бара описание будет как-то так: <конкретный_элемент x="445" y="349" width="140" height="4" horz="1" min="0" max="100" pos="0"> <progress> <texture a="255" r="255" g="255" b="255">ui_scale_green_sect_horz</texture> </progress> <background> <texture a="80" r="255" g="255" b="255">ui_scale_green_sect_horz</texture> </background> </конкретный_элемент> Изменено 15 Октября 2016 пользователем UnLoaded 1 Ссылка на комментарий
Карлан 1 050 Опубликовано 15 Октября 2016 Поделиться Опубликовано 15 Октября 2016 UnLoaded писал(а): Ну наверное ему нужно все-же SetProgressPos, если разговор о прогресс-баре. Да, разумеется, я почему-то написал иное, причем дважды, хотя имел ввиду именно SetProgressPos. Сюда же GetProgress, впрочем не так важно, я доносил иную мысль, остальное все видно из сигнатуры класса. 1 Ссылка на комментарий
FonSwong 33 Опубликовано 16 Октября 2016 Поделиться Опубликовано 16 Октября 2016 Какой функцией можно собрать все ноды с локации и узнать координаты оных? Ссылка на комментарий
Zander_driver 10 345 Опубликовано 17 Октября 2016 Поделиться Опубликовано 17 Октября 2016 level.vertex_position(number) не подойдет? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
FonSwong 33 Опубликовано 17 Октября 2016 Поделиться Опубликовано 17 Октября 2016 (изменено) Zander_driver писал(а): level.vertex_position(number) не подойдет? слишком мало на уровне, тот же кордон 200 с чем-то всего-лишь, подумал по нодам (аи сетки) спавнить, но тут мне сказали: Цитата В моде ПТО мы ещё 1,5 года назад сделали спавн аномалий по рандомным координатам локации и ни к каким нодам не привязывались. Причём во время выброса одни аномалии рассасывались, а после окончания выброса другие спавнились рандомно по новым координатам. Аномалии вообще к нодам ( к АИ-сетке ) не привязаны никак. буду ковырять Припять Точку Отчёта, забью на ноды пока что... Если есть более конкретные подсказки, буду рад Изменено 17 Октября 2016 пользователем FonSwong Ссылка на комментарий
Карлан 1 050 Опубликовано 18 Октября 2016 Поделиться Опубликовано 18 Октября 2016 @FonSwong, возьми исходники, там есть доступ к левел графу, у которого в свойствах есть количество вертексов (нод), отсюда без всяких сторонних функций в одну строку ты можешь взять рандомный вертекс с уровня. Функции инверсны, по позиции можно получить вертекс, и позицию можно получить по вертексу, все весьма удобно. Я, если не ошибаюсь, так и делал, брал рандомный вертекс, далее брал позицию из него и спавнил, с точки зрения скриптовой реализации все весьма не дурно. Исходя из левелвертекса можешь получить точный геймвертекс. На самом деле там все сильно взаимосвязано и довольно многие данные можно получать без дополнительных действий. 1 Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) @Карлан, Собственно я так и делал, по вертексам Код: (Показать) tbl_din_anom = {} local anom = { --ЛОКАЛЬНЫЕ АНОМАЛИИ 'zone_mine_acidic_weak', --газировка 'zone_mine_acidic_average', 'zone_mine_acidic_strong', --'zone_mine_acidic_big', --НЕ УДАЛОСЬ ЗАСПАВНИТЬ 'zone_buzz_weak', --холодец(первый вид) 'zone_buzz_average', 'zone_buzz_strong', 'zone_mine_chemical_weak', --холодец(второй вид) 'zone_mine_chemical_average', 'zone_mine_chemical_strong', 'zone_mine_electric_weak', --электра обычная 'zone_mine_electric_average', 'zone_mine_electric_strong', 'zone_mine_static_weak', --электра статическая 'zone_mine_static_average', 'zone_mine_static_strong', 'zone_witches_galantine_weak', --электра невидимая(хз, так же статична) 'zone_witches_galantine_average', 'zone_witches_galantine_strong', 'zone_mine_thermal_weak', --жарка(первый вид) 'zone_mine_thermal_average', 'zone_mine_thermal_strong', 'zone_zharka_static_weak', --жарка(второй вид) 'zone_zharka_static_average', 'zone_zharka_static_strong', 'zone_mine_steam_weak', --жарка(пар) 'zone_mine_steam_average', 'zone_mine_steam_strong', 'zone_gravi_zone', --грави 'zone_mine_gravitational_weak', --трамплин 'zone_mine_gravitational_average', --воронка 'zone_mine_gravitational_strong', --карусель(первый вид) 'zone_mine_gravitational_big', --карусель(второй вид) 'zone_mosquito_bald', --комаринная плешь 'zone_mosquito_bald_weak', 'zone_mosquito_bald_weak_noart', 'zone_mosquito_bald_average', 'zone_mosquito_bald_strong', 'zone_mosquito_bald_strong_noart', --ЗОНАЛЬНЫЕ АНОМАЛИИ 'zone_radioactive', --радиация(первый вид)(БЕЗВРЕДНАЯ) 'zone_radioactive_weak', --радиация(первый вид) 'zone_radioactive_average', 'zone_radioactive_strong', 'zone_field_radioactive', --радиация(второй вид)(БЕЗВРЕДНАЯ) 'zone_field_radioactive_weak', --радиация(второй вид) 'zone_field_radioactive_average', 'zone_field_radioactive_strong', 'zone_field_acidic', --кислотный туман(БЕЗВРЕДНАЯ) 'zone_field_acidic_weak', 'zone_field_acidic_average', 'zone_field_acidic_strong', 'zone_field_psychic', --пси зона 'zone_field_psychic_weak', 'zone_field_psychic_average', 'zone_field_psychic_strong', 'zone_field_thermal', --высокая температура 'zone_field_thermal_weak', 'zone_field_thermal_average', 'zone_field_thermal_strong' } function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() store_table(t) for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' and k == 'l01_escape' then local i = 0 while i < count do local r_lv = math.random(#t.LevelsVertexes[k]) local r_gv = math.random(#t.GameVertexes[k]) local r_anom = math.random(#anom) local sobj = create_anom(anom[r_anom],3,t.LevelsVertexes[k][r_lv],t.GameVertexes[k][r_gv]) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t['LevelsVertexes'] = {} t['GameVertexes'] = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t['LevelsVertexes'][ln] then t['LevelsVertexes'][ln] = {} end if not t['GameVertexes'][ln] then t['GameVertexes'][ln] = {} end t['LevelsVertexes'][ln][#t['LevelsVertexes'][ln]+1] = v:level_vertex_id() t['GameVertexes'][ln][#t['GameVertexes'][ln]+1] = i i = i+1 end return t end function create_anom(section,radius,lv,gv,mode) local pos = level.vertex_position(lv) local sobj = alife():create(section,pos,lv,gv) local t = stpk_utils.get_anom_zone_data(sobj) --[[if mode then t.custom_data = 'field' end]] -- почему-то пишут что нужно, хотя нормально и без него... t.shapes = {} t.shapes[1] = {} t.shapes[1].shtype = 0 t.shapes[1].offset = vector():set(0, 0, 0) t.shapes[1].radius = radius stpk_utils.set_anom_zone_data(t,sobj) return sobj endtbl_din_anom = {} local anom = { --ЛОКАЛЬНЫЕ АНОМАЛИИ 'zone_mine_acidic_weak', --газировка 'zone_mine_acidic_average', 'zone_mine_acidic_strong', --'zone_mine_acidic_big', --НЕ УДАЛОСЬ ЗАСПАВНИТЬ 'zone_buzz_weak', --холодец(первый вид) 'zone_buzz_average', 'zone_buzz_strong', 'zone_mine_chemical_weak', --холодец(второй вид) 'zone_mine_chemical_average', 'zone_mine_chemical_strong', 'zone_mine_electric_weak', --электра обычная 'zone_mine_electric_average', 'zone_mine_electric_strong', 'zone_mine_static_weak', --электра статическая 'zone_mine_static_average', 'zone_mine_static_strong', 'zone_witches_galantine_weak', --электра невидимая(хз, так же статична) 'zone_witches_galantine_average', 'zone_witches_galantine_strong', 'zone_mine_thermal_weak', --жарка(первый вид) 'zone_mine_thermal_average', 'zone_mine_thermal_strong', 'zone_zharka_static_weak', --жарка(второй вид) 'zone_zharka_static_average', 'zone_zharka_static_strong', 'zone_mine_steam_weak', --жарка(пар) 'zone_mine_steam_average', 'zone_mine_steam_strong', 'zone_gravi_zone', --грави 'zone_mine_gravitational_weak', --трамплин 'zone_mine_gravitational_average', --воронка 'zone_mine_gravitational_strong', --карусель(первый вид) 'zone_mine_gravitational_big', --карусель(второй вид) 'zone_mosquito_bald', --комаринная плешь 'zone_mosquito_bald_weak', 'zone_mosquito_bald_weak_noart', 'zone_mosquito_bald_average', 'zone_mosquito_bald_strong', 'zone_mosquito_bald_strong_noart', --ЗОНАЛЬНЫЕ АНОМАЛИИ 'zone_radioactive', --радиация(первый вид)(БЕЗВРЕДНАЯ) 'zone_radioactive_weak', --радиация(первый вид) 'zone_radioactive_average', 'zone_radioactive_strong', 'zone_field_radioactive', --радиация(второй вид)(БЕЗВРЕДНАЯ) 'zone_field_radioactive_weak', --радиация(второй вид) 'zone_field_radioactive_average', 'zone_field_radioactive_strong', 'zone_field_acidic', --кислотный туман(БЕЗВРЕДНАЯ) 'zone_field_acidic_weak', 'zone_field_acidic_average', 'zone_field_acidic_strong', 'zone_field_psychic', --пси зона 'zone_field_psychic_weak', 'zone_field_psychic_average', 'zone_field_psychic_strong', 'zone_field_thermal', --высокая температура 'zone_field_thermal_weak', 'zone_field_thermal_average', 'zone_field_thermal_strong' } function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() store_table(t) for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' and k == 'l01_escape' then local i = 0 while i < count do local r_lv = math.random(#t.LevelsVertexes[k]) local r_gv = math.random(#t.GameVertexes[k]) local r_anom = math.random(#anom) local sobj = create_anom(anom[r_anom],3,t.LevelsVertexes[k][r_lv],t.GameVertexes[k][r_gv]) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t['LevelsVertexes'] = {} t['GameVertexes'] = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t['LevelsVertexes'][ln] then t['LevelsVertexes'][ln] = {} end if not t['GameVertexes'][ln] then t['GameVertexes'][ln] = {} end t['LevelsVertexes'][ln][#t['LevelsVertexes'][ln]+1] = v:level_vertex_id() t['GameVertexes'][ln][#t['GameVertexes'][ln]+1] = i i = i+1 end return t end function create_anom(section,radius,lv,gv,mode) local pos = level.vertex_position(lv) local sobj = alife():create(section,pos,lv,gv) local t = stpk_utils.get_anom_zone_data(sobj) --[[if mode then t.custom_data = 'field' end]] -- почему-то пишут что нужно, хотя нормально и без него... t.shapes = {} t.shapes[1] = {} t.shapes[1].shtype = 0 t.shapes[1].offset = vector():set(0, 0, 0) t.shapes[1].radius = radius stpk_utils.set_anom_zone_data(t,sobj) return sobj end Итак, начинаю пояснять конкретно о проблеме, в функции Get_Levels_and_Game_Vertexes() мы получаем таблицей Левел и гейм вертиксы всех локаций: https://yadi.sk/d/MQ7rA_AQxBWkR Например для левела эскейп находятся 279 левел вертиксов, то бишь мы имеем на этом уровне ВСЕГО ЛИШЬ 279 координат спавна, что очень мало, и при спавне свыше 279 штук аномалий, они, аномалии, начинают накладываться друг на друга!(отсеивание спавна по одинаковым координатам в коде нету, я знаю) Собственно в этом и заключается проблема, в том, что мне нужно больше координат спавна по локации, левел вертиксов слишком мало. Как мне получить координаты каждой ноды аи-сетки, думаю как раз таки это мне облегчит жизнь. П.С.: где-то кто-то говорил что можно как-то использовать реализацию дождя, мол дождь бьёт по геометрии, и это можно использовать для спавна аномалий Изменено 19 Октября 2016 пользователем Eugen81 Добавлено Eugen81, 19 Октября 2016 Ты уверен, что таблицу в 10000 строк надо было выкладывать сюда под спойлер? Больше так не делай. Ссылка на комментарий
naxac 2 507 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) FonSwong писал(а): Левел и гейм вертиксы всех локаций Это не все доступные левел-вертексы. Как ты их считал? По граф-поинтам (гейм-вертексам)? Так вот, это только вертексы граф-поинтов. Берешь самый большой из них для нужной локации, потом через math.random(1, <самый большой вертекс>) получаешь случайный вертекс, затем через level.vertex_position получаешь его координаты, а потом ищешь ближайший к этим координатам гейм-вертекс. Посмотри скрипты спавна динамических аномалий из того же АМК. Изменено 19 Октября 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 (изменено) @naxac, Я подозревал, что не все вертексы использую, но не мог сам себе объяснить почему. Благодарю за подробный ответ. Ещё вопрос, когда спавним, то указываем level vertex и game vertex, за что конкретно они отвечают? Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Изменено 19 Октября 2016 пользователем FonSwong Ссылка на комментарий
naxac 2 507 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 FonSwong писал(а): Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Этого не знаю, надо у двигоправов спрашивать, что там к чему. Возможно, вертексы при спавне нужны для Ai. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
UnLoaded 313 Опубликовано 19 Октября 2016 Поделиться Опубликовано 19 Октября 2016 FonSwong писал(а): Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать? Уже много раз обсуждалось: при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить, и координаты - для размещения объекта. Левел-вертекс не имеет значения и похоже движком не используется\игнорируется. Соответственно, гейм-вертекс можно указать любой, относящийся к локации. Ссылка на комментарий
Карлан 1 050 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 UnLoaded писал(а): при спавне объектов, движок использует гейм-вертекс - для идентификации уровня, на котором будем спавнить Тем не менее это ошибочное суждение, для серверного объекта этот параметр важен, при "любом" гейм вертексе могут возникать конфликты с масками, если они будут активно использоваться. Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой. Есть еще масса функций управления вершинами, которые использует движок, здесь он, очевидно, будет работать не с той вершиной. FonSwong писал(а): Собственно я так и делал, по вертексам Совершенно не так. Ты делаешь таблицы с магическими цифрами, это, на мой взгляд, довольно некорректное решение вопроса, к тому же, как верно заметили, массив ошибочен, его нужно составлять инверсионно твоему, но я повторюсь, у геймвертекса его левелвертекс есть в свойствах (он не может быть ему не ассоциирован). То есть ты должен просто получить одно из другого, рандомная вершина с текущего уровня берется одной строкой безо всяких функций составляющих массивы с магическими цифрами, из этого вереткса получаешь его позицию и гейм вертекс, это еще пара строк (если без изменений в общедоступные исходники, то нужно будет сделать цикл по гейм вертексам уровня, где рекомендую каждый проверить на валидность и далее проверяй на соответствие твоей вершине), затем спавнишь (у меня примерно так и работает). Возможно есть более корректные алгоритмы, но я профан в навигации, наверняка можно напрямую ассоццированный гейм вертекс получить, тут уже нужно в движок глядеть. Ссылка на комментарий
UnLoaded 313 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 Карлан писал(а): Еще так же советую обратить внимание на возможность управления "включенности" гейм вертекса, вы попросту можете отключить не тот вертекс, и это будет ошибкой. Вот это не понял напрочь: что означает "включенность" гейм-вертекса ? Хочу подробнее . Так-же - что такое вершины ? Другое название гейм-вертекса ? Почему ? Ссылка на комментарий
abramcumner 1 208 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 (изменено) 20.10.2016 в 16:27, UnLoaded сказал: Вот это не понял напрочь: что означает "включенность" гейм-вертекса ? Скорей всего имеется ввиду следующий код из bind_physic_object.script: game_graph():accessible(self.disable_graph_point, false)game_graph():accessible(self.disable_graph_point, false)Можно отключить вершину и НПЦ будут обходить все аи-ноды, которые соотвествуют этому геймвертексу. Этакая эмуляция закрытых дверей для НПЦ Вершина - русское слово, вертекс - калька с английской. Обозначают одно и тоже. Изменено 20 Октября 2016 пользователем abramcumner Ссылка на комментарий
FonSwong 33 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 (изменено) Ну в общем я переписал и сделал как-то вот так, вроде работает: Показать tbl_din_anom = {} function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' then local i = 0 while i < count do local r_lv = math.random(1, t.LevelsVertexes[k]) local pos = level.vertex_position(r_lv) local min_gv = t.GameVertexes[k][1] local max_gv = t.GameVertexes[k][2] local r_anom = math.random(#anom) local new_gv = 0 local min_dist = 100000 --подбираем геймвертекс for a = min_gv, max_gv do local g1 = game_graph():vertex(a):game_point() if g1:distance_to(pos)<min_dist then min_dist = g1:distance_to(pos) new_gv = a end end local sobj = create_anom(anom[r_anom],3,pos,r_lv,new_gv) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t.LevelsVertexes = {} t.GameVertexes = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() elseif v:level_vertex_id() > t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() end if not t.GameVertexes[ln] then t.GameVertexes[ln] = {} end if not t.GameVertexes[ln][1] then t.GameVertexes[ln][1] = i else t.GameVertexes[ln][2] = i end i = i+1 end return t end tbl_din_anom = {} function random_anomalies(count) local t = Get_Levels_and_Game_Vertexes() for k, v in pairs(t['GameVertexes']) do if k ~= 'fake_start' then local i = 0 while i < count do local r_lv = math.random(1, t.LevelsVertexes[k]) local pos = level.vertex_position(r_lv) local min_gv = t.GameVertexes[k][1] local max_gv = t.GameVertexes[k][2] local r_anom = math.random(#anom) local new_gv = 0 local min_dist = 100000 --подбираем геймвертекс for a = min_gv, max_gv do local g1 = game_graph():vertex(a):game_point() if g1:distance_to(pos)<min_dist then min_dist = g1:distance_to(pos) new_gv = a end end local sobj = create_anom(anom[r_anom],3,pos,r_lv,new_gv) table.insert(tbl_din_anom,sobj.id) level.map_add_object_spot_ser(sobj.id, "blue_location", sobj.id) i = i + 1 end end end end function Get_Levels_and_Game_Vertexes() local t = {} local i = 0 t.LevelsVertexes = {} t.GameVertexes = {} local graph = game_graph() while graph:valid_vertex_id(i) do local v = graph:vertex(i) local ln = alife():level_name(v:level_id()) if not t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() elseif v:level_vertex_id() > t.LevelsVertexes[ln] then t.LevelsVertexes[ln] = v:level_vertex_id() end if not t.GameVertexes[ln] then t.GameVertexes[ln] = {} end if not t.GameVertexes[ln][1] then t.GameVertexes[ln][1] = i else t.GameVertexes[ln][2] = i end i = i+1 end return t end Может чего лишнего намудрил? Изменено 20 Октября 2016 пользователем FonSwong 1 Ссылка на комментарий
advisor890 1 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 Есть функция проверки близости ГГ к аномалии.function anomaly_prec:update()local distance = self.object :position():distance_to(db.actor :position())if distance < 10 then"Действие выполняется если игрок подойдет к аномалии на расстояние меньше 10 метров"endendПроблема в том что мне нужно чтобы действие выполнялось когда ГГ подходит к аномалии на определенное расстояние. Допустим действие будет выполнятся если игрок подходит к аномалии на расстояние 10 метров. Не больше не меньше. Именно конкретное число. If distance == не предлагать. Если так поставить, то действие выполнятся не будет. Ссылка на комментарий
UnLoaded 313 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 advisor890 писал(а): If distance == не предлагать. Если так поставить, то действие выполнятся не будет. С чего бы это ? Если у тебя в кармане 10руб(монетой) - то условие "if в_кармане == 10 then" не должно выполняться ? Ищи ошибку у себя в проверках\условиях, причем достаточно тупую(это без оскорблений, просто так оно и есть)... Ссылка на комментарий
Карлан 1 050 Опубликовано 20 Октября 2016 Поделиться Опубликовано 20 Октября 2016 UnLoaded писал(а): то условие "if в_кармане == 10 then" не должно выполняться ? Конкретно здесь оно выполнятся не будет. Это очевидно. Ошибки здесь нет, здесь есть не понимание принципов работы с подобными величинами. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти