Garry_Galler 7 Опубликовано 1 Февраля 2010 (изменено) Monnoroch а зачем тебе левер вертекс? если мне надо смещение прямо перед ГГ я использую такую функцию function spawn_bobm() local pos = db.actor:position() local dir = db.actor:direction() pos = pos:add(dir:mul(2)) --смещение 2 метра прямо перед ГГ local obj = alife():create("bomba", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id()) obj_id = obj.id end вот так у меня спавнится перед ГГ бомба с дистанционным управлением - то есть она как бы из инвентаря(удаляясь оттуда) перекидывается на землю. телепорты я спавнил обычной функцией - через create - ну конфиг еще создавал для них + биндер самодельных телепортов от Imp'а Изменено 1 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 1 Февраля 2010 (изменено) Monnoroch ну не знаю - я спавнил десяток солдат на дистанции 20 метров от ГГ - нормально спавнились - прямо по курсу. Причем курс собственно можно задать - через dir = vector_rotate_y(obj:direction(),ang) где ang - угол поворота по вектору y Изменено 1 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 SCRIPT function spawn () for i =1, 1000000 do alife():create("айди npс из spawn sections - типа "agr_stalker_regular",vector():set(x,y,z),lv,gv) end end получаешь миллион NPC за раз. :ny_ph34r_1: а если хочешь чтобы у каждого была своя координата - тогда просто дублируешь строчки с alife():create и в каждую нужный профиль и нужные координаты вписываешь. можно сделать рандомные координаты... чтобы не снимать их для каждого NPC по отдельности. тебе что надо? Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 (изменено) SCRIPT мне надо так, чтоб была группа нейтралов полукругом вот тебе группа нейтралов полукругом Что требуется от тебя: 1.получить координаты точки -которая будет центром 2.задать радиус от центра этой точки - на этой дистанции от точки и будут спавниться NPC 3. задать угол смещения - чтобы NPC спавнились на равномерной дистанции друг от друга и полукругом. угол считаешь так - если нужен полукруг - 180 градусов делишь на кол-во NPC - получаешь нужный угол. В примере две функции - обе рабочие - просто второй вариант теоретически более надежен так как исключает спавн под землю. хотя и первый при правильной дирекции (подобрал методом проб) тоже спавнит нормально. Кстати дирекцию тебе возможно придется подправить - может и не подойти. (я в ней пока толком не разобрался) варианты (1,1,1) - не пробовал; (0,0,0) - спавнились вроде в ряд; (1,0,1) - спавнились частично под землю но полукругом (1,1,0) - не пробовал (0,1,0) - в ряд local angle = 0 function spawn_new() local pos = vector():set(-241.74,-19.54,-127.23) -- нужные координаты local dir = vector():set(0,0,1) local lv = 14471 --левел вертекс позиции точки local gv = 8 --гейм вертекс позиции точки for i=1, 10 do --кол-во NPC if (angle > 360) then angle = angle - 360 end local new_dir = vector_rotate_y (dir, angle) pos = pos:add(new_dir:mul(5)) -- 5 - это дистанция от центра точки alife():create("agr_stalker_regular", pos, lv, gv) angle=angle+20 --диапазон изменения угла end end local angle = 0 function spawn_new_2() --local pos = vector():set(-241.74,-19.54,-127.23) -- здесь они не нужны local dir = vector():set(0,0,1) local lv = 14471 local gv = 8 for i=1, 10 do if (angle > 360) then angle = angle - 360 end local new_dir = vector_rotate_y (dir, angle) local lvid = level.vertex_in_direction(lv,new_dir,5) local lpos = level.vertex_position(lvid) alife():create("agr_stalker_regular", lpos, lvid, gv) angle=angle+20 end end чуть не забыл - во второй функции собственно координаты точки вообще не нужны - а нужны только вертексы, так как позиция высчитывается по ним. то есть строчка local pos = ... лишняя Изменено 2 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 (изменено) Monnoroch Не понял о чем ты. в одной функции позиция получается исходя из математического операции по сложению и умножению векторов (ну как так в общем - я в математике не силен). в другой - определяется ближайший вертекс на заданной дистанции от первого вертекса, а уже по нему - новая позиция (плюс вращение по y ) есть еще третий вариант -банальное смещение по векторам x и z - но он больше подходит для спавна NPC или мобов в очень рандомных позициях от точки - дабы они не кучковались все вместе. вместо координат точки везде можно использовать позицию и вертексы эктора. Изменено 2 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 Кто знает как игра узнает что NPC ранен? то бишь на что реагирует эвалюатор wound запускающий анимацию ранености и т.д.? в xr_wounded не нашел никакой проверки здоровья - там задействована глобальная функция critically_wounded() которая видимо это отслеживает. Но в скриптах ее нет. Значит движковая? просто непонятно при каком пороге здоровья NPC считается раненым. пока пытаюсь выяснить это методом проб. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 (изменено) Monnoroch да я сейчас глянул внимательнее - тоже нашел что то похожее на это. только у меня все равно хрень какая то происходит - делаю принудительное вычитание здоровья obj.health = - math.random(0.1, 0.6) - получаю что npc просто дохнет если ниже 0.6 (ставил 0.5) то ничего не происходит. правда у меня это дело осложняется трехсекундным апдейтом - но там сколько тактов успеет пройти - 1-3? может конечно за это время вычитание здоровья пару раз успевает произойти... в общем не знаю как сделать чтобы здоровье NPC уменьшалось рандомно - от ничего до смерти, ну и чтобы до состояния ранености чаще всего. Изменено 2 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Февраля 2010 lekzd эти пасхалки не только в билде 1935 :ny_megalol: --Звуки для сталкера новичка, который лазит по свалке и ищет артефакты. 1 - утомился ходить, пойду отдохну, 2 - где эти гребанные артефакты --Звуки для сталкера новичка, которого ограбили. 1 - Почему так все плохо, 2 - зовет актера, 3 - пойди и убью этих козлов Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 4 Февраля 2010 SCRIPT У тебя видимо комп не тянет. Системных ресурсов не хватает - по крайней мере у меня такой же лог был когда комп не смог переварить одну мою скриптовую операцию. Памяти было занято под завязку. Кстати тут как то выражали мнение что нельзя отследить что впереди - перед ГГ - находится препятствие - довольно простой скрипт смог это сделать - (правда его еще доработать надо). Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 4 Февраля 2010 malandrinus А другого способа видимо и не существует :ny_ph34r_1: Но его вполне достаточно. Но у меня другая проблема- отображение информации об объектах за препятствием - забором, стенкой, в здании. У меня стоит проверка на дистанцию - сделал для теста 15 метров - и добавил туда доп. условие and db.actor:see(obj) - то есть сначала нужно зацепить объекты "взглядом" эктора - без нее скрипт работает как то криво - то вообще ничего не отображает то урывками или цепляется за объекты позади эктора ( в общем пока адекватного результат добился только с этой проверкой). Мне в общем надо как то уйти от этого метода - db.actor:see(obj) - но оставить его результат - сужение угла видимости объектов при проверки дистанции до них. Чтобы "цеплялись" только те которые впереди камеры - скажем угол обзора в 60 градусов - (от линии взгляда 30 вправо - 30 влево) будет нормально. Но не знаю пока как это сделать. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 5 Февраля 2010 (изменено) malandrinus как сделать проверку на то что объект попадает в заданный конус взгляда я толком не знаю. в общем попробовал для начала получить угол между линией до объекта и линией взгляда эктора(точнее камеры) сделал так: --вычитаем из конечной точки начальную - получаем луч вектора от камеры до объекта local ray =obj:position():sub(device().cam_pos) согласно теоремам математики скалярное произведение векторов равно произведению их длин на косинус угла между ними Т.о. чтобы вычислить угол нужно иметь в наличие скалярное произведение векторов --получаем его local dp=ray:dotproduct(device().cam_dir) --получаем произведение длин векторов local len = ray:magnitude()* device().cam_dir:magnitude() --получаем косинус угла --делим скаляр векторов на произведение их длин local cosinus = dp/len --инвертируем косинус угла в реальный угол через аркосинус - и сразу переводим радианы в градусы local angle = math.acos(cosinus)*57 Результат - вроде выдается угол. Но только не совсем точный (+-5-7 градусов). Я подозреваю, что надо позицию камеры заменить на позицию эктора. В общем если где ошибся то поправь пожалуйста - я с математикой не очень :ny_unsure: Или все проще можно сделать? Понятно. Я значит велосипед изобретал - столько раз вроде заглядывал в G скрипт а этих функций не приметил. :ny_smile: Ну что ж попробуем их использовать. Изменено 5 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 5 Февраля 2010 (изменено) malandrinus посмотрел я функции из G - да действительно разрабы использовали обычные методы математики. Скалярное произведение считается по обычной формуле. И модуль(длина) каждого вектора вычисляется по стандартной формуле как квадратный корень из сумм квадратов соответствующих координат. Причем ось y для угла проекции двух векторов на плоскость земли не учитывается – (вот из за нее то и неточность видимо у меня - так как при смещении камеры к ногам объекта - значение выравнивается почти к нулю - как и должно). Значит при моем способе - использующем методы класса вектор все быстрее работает? :ny_wink: Кстати сегодня пока рылся в инете (поднимая свои школьные знания по математике в области векторов) наткнулся на одну интересную статью по алгоритму отслеживания столкновений с препятствиями в игровых движках. Там упоминался метод основанный на октодереве - интересно а в сталкере какой алгоритм реализован... Изменено 5 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 7 Февраля 2010 (изменено) Решил получить дистанцию до объекта чистой математикой local v1 = wolf:position() local v2 = db.actor:position() --получаем вектор-радиус от позиции ГГ до точки стояния волка local v3 =v1:sub(v2) --получаем длину вектора чистой математикой local len = math.sqrt((v3.x*v3.x) + (v3.y*v3.y) + (v3.z*v3.z)) --дистанция между точками - по стандартной формуле local dist_to_point = math.sqrt((v1.x - v2.x)^2 + (v1.y - v2.y)^2 + (v1.z - v2.z)^2) вопрос такой: получаю некую цифру(большую - скажем реальная дистанция около 20 метров - получаю 647) - в каких единицах она и как ее перевести в метры? и почему len и dist_to_point у меня имеют разные значения? по идее должны быть равны...длина вектора между двумя точками должна быть равна расстоянию между ними. Где я тут ошибся? Изменено 7 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 7 Февраля 2010 (изменено) malandrinus дак я 3D геометрию изучаю (и уравнения для 3d плоскостей) и чтобы каждый раз за формулами в википедию не лазить - надо их в голове уложить - вот я вместо методов и занимаюсь математикой (понятно что в том же С++ куча готовых функций класса point, vertex, poligon - но хочется ведь еще и понимать как они работают). ну с длиной вектора значит ясно в чем ошибка. а с расстоянием то что не то? почему оно в 600 метров получается? формула вроде правильная... тогда кстати и длина вектора такой же получится...щас проверю. Monnoroch про расстояние в посте ничего не написано. Изменено 7 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 7 Февраля 2010 (изменено) malandrinus проверил с твоей поправкой. Причем для сравнения сделал получение длины вектора четырьмя вариациями - все результаты совпали и - при ручном вычитании компонентов и через sub, затем через magnitude() и математически. И на этот раз все совпало и с получаемым математически расстоянием от точки до точки. Теперь длина вектора действительно равна расстоянию между точками - как и должно быть. НО это ведь никак не коррелирует с реальной дистанцией... да простит меня Виет но я ничего не понимаю... Елы палы - это ж у меня квадрат расстояния получается - 400 = 20 реальным в квадрате...только почему квадрат то? Изменено 7 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 7 Февраля 2010 (изменено) XrAlexR Советую для начала почитать статьи по настройке логики. у тебя зачем стоит таймер с переходом к несуществующей секции логики? зачем строчка meet = meet когда самой секции meet у тебя нет? Если берешь примеры из статей - то не бери их бездумно - там откуда ты взял эту логику - это только часть большой схемы. Если выдираешь - то выдирай правильно. если NPC уходит - значит эта логика не читается. Смотри правильность указания пути до файла с логикой в кустом дате. Анимации сидения на чем либо - типа sidya_boltaet_ 0 , stul и т.д. вырезаны - то есть надо восстанавливать. Как - разбирай файл state_mgr_animation_list Изменено 7 Февраля 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 7 Февраля 2010 Monnoroch только как ее скачать - непонятно. я заходил на тот аглицкий сайт - долго ковырялся, но ссылку на скачку так и не получил. та прога пишет все нажатия в ltx файл - а потом в нужный момент можно оттуда считать что нажата нужная клавиша. на SP один чел тоже такую пишет - на С шарпе - но пока тесты не очень впечатляющи по его словам - много проблем. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 8 Февраля 2010 XrAlexR Так проверь sidya_boltaet_ 0 и kurit sidya_ 0 если это все сидя на заду то других просто нет. Кроме анимок Сидора - но их ты никуда не прикрутишь. На инсайд вики зайди - там статья есть почти по всем вырезанным анимкам - "библиотека вырезанных анимаций". Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Июня 2010 (изменено) _Призрак_ но знаю точно что local npc ........ надо вставить в саму функцию это делается исходя из контекста и задач кода , а не в обязательном порядке. ------------------------------------------------------------------------------------------------- Вопрос. Есть проблема с виждетом приаттаченым к окну инвентаря через level.main_input_receiver(). Мой виджет - это статик с надписью и четыре чекбаттона приаттаченых к статику. В инвентаре отображается все норм - активация на открытие инвентаря (плюс проверка на нужный ствол в слоте) - кнопки пашут. Но во первых этот виджет не хочет удаляться из инвентаря никакими методами (а нужно чтобы удалялся\прятался когда нужного ствола нет в слоте), и самое печальное что при перезагрузке происходит вылет на открытие инвентаря - причем без разницы ататчится ли виджет заново или нет - сначала думал что вылет из-за повторного аттача (он вообще происходила однократно при открытии инвентаря и блок сразу закрывался от апдейта до перезагрузки игры --внешняя локальная переменная - флаг апдейта - изначально имела значение просто true local update =xr_logic.pstor_retrieve(db.actor,"ui_update", true) -- теперь сделал так .... if update then inventory = level.main_input_receiver() -- получаем родительское окно if inventory then wnd = Gravi(inventory) -- вызываем наш класс где виджет аттачится к окну инвентаря. update = false -- закрываем блок от апдейта xr_logic.pstor_store(db.actor,"ui_update",false) -- сохраним end end ) - поставил сохранение значения переменной которая закрывает блок первичного приаттачивания виджета от апдейта в pstor , но вылет(в логе либо stack trace (стек вызов) либо даже самого списка вызовов нет - в общем ничего информативного ) все равно происходит: либо сразу,либо при наведении курсора на кнопки виджета после открытия инвентаря. не могу понять из-за чего? ведь пока не перезагрузишься все идеально... Изменено 23 Июня 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Июня 2010 Stalk15 006 -- это не айди волка!, а его сид. верно подмечено - не пошли на пользу все наши уроки товарисчу на СП. :-) Stalk15 надо использовать level_object_by_sid( sid объекта ) Поделиться этим сообщением Ссылка на сообщение