Все посты %s в %S - AMK Team
Перейти к контенту

[SoC] Ковыряемся в файлах


Halford

Рекомендуемые сообщения

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'а

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch

ну не знаю - я спавнил десяток солдат на дистанции 20 метров от ГГ - нормально спавнились - прямо по курсу. Причем курс собственно можно задать - через dir = vector_rotate_y(obj:direction(),ang) где ang - угол поворота по вектору y

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

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 по отдельности.

тебе что надо?

Поделиться этим сообщением


Ссылка на сообщение

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   = ... лишняя

 

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch

Не понял о чем ты.

 

в одной функции позиция получается исходя из математического операции по сложению и умножению векторов (ну как так в общем - я в математике не силен).

в другой - определяется ближайший вертекс на заданной дистанции от первого вертекса, а уже по нему - новая позиция (плюс вращение по y )

есть еще третий вариант -банальное смещение по векторам x и z - но он больше подходит для спавна NPC или мобов в очень рандомных позициях от точки - дабы они не кучковались все вместе.

вместо координат точки везде можно использовать позицию и вертексы эктора.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Кто знает как игра узнает что NPC ранен?

то бишь на что реагирует эвалюатор wound запускающий анимацию ранености и т.д.?

в xr_wounded не нашел никакой проверки здоровья - там задействована глобальная функция critically_wounded() которая видимо это отслеживает.

Но в скриптах ее нет. Значит движковая?

просто непонятно при каком пороге здоровья NPC считается раненым. пока пытаюсь выяснить это методом проб.

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch

да я сейчас глянул внимательнее - тоже нашел что то похожее на это.

только у меня все равно хрень какая то происходит - делаю принудительное вычитание здоровья

obj.health = - math.random(0.1, 0.6) - получаю что npc просто дохнет если ниже 0.6 (ставил 0.5) то ничего не происходит.

правда у меня это дело осложняется трехсекундным апдейтом - но там сколько тактов успеет пройти - 1-3?

может конечно за это время вычитание здоровья пару раз успевает произойти...

в общем не знаю как сделать чтобы здоровье NPC уменьшалось рандомно - от ничего до смерти, ну и чтобы до состояния ранености чаще всего.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

lekzd

эти пасхалки не только в билде 1935 :ny_megalol:

--Звуки для сталкера новичка, который лазит по свалке и ищет артефакты. 1 - утомился ходить, пойду отдохну, 2 - где эти гребанные артефакты

 

--Звуки для сталкера новичка, которого ограбили. 1 - Почему так все плохо, 2 - зовет актера, 3 - пойди и убью этих козлов

Поделиться этим сообщением


Ссылка на сообщение

SCRIPT

У тебя видимо комп не тянет. Системных ресурсов не хватает - по крайней мере у меня такой же лог был когда комп не смог переварить одну мою скриптовую операцию. Памяти было занято под завязку.

 

 

Кстати тут как то выражали мнение что нельзя отследить что впереди - перед ГГ - находится препятствие -

довольно простой скрипт смог это сделать - (правда его еще доработать надо).

51625234.th.jpg

 

 

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

А другого способа видимо и не существует :ny_ph34r_1:

Но его вполне достаточно.

Но у меня другая проблема- отображение информации об объектах за препятствием - забором, стенкой, в здании.

У меня стоит проверка на дистанцию - сделал для теста 15 метров - и добавил туда доп. условие and db.actor:see(obj) - то есть сначала нужно зацепить объекты "взглядом" эктора - без нее скрипт работает как то криво - то вообще ничего не отображает то урывками или цепляется за объекты позади эктора ( в общем пока адекватного результат добился только с этой проверкой).

Мне в общем надо как то уйти от этого метода - db.actor:see(obj) - но оставить его результат - сужение угла видимости объектов при проверки дистанции до них. Чтобы "цеплялись" только те которые впереди камеры - скажем угол обзора в 60 градусов - (от линии взгляда 30 вправо - 30 влево) будет нормально. Но не знаю пока как это сделать.

Поделиться этим сообщением


Ссылка на сообщение

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:

Ну что ж попробуем их использовать.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

посмотрел я функции из G - да действительно разрабы использовали обычные методы математики. Скалярное произведение считается по обычной формуле. И модуль(длина) каждого вектора вычисляется по стандартной формуле как квадратный корень из сумм квадратов соответствующих координат. Причем ось y для угла проекции двух векторов на плоскость земли не учитывается – (вот из за нее то и неточность видимо у меня - так как при смещении камеры к ногам объекта - значение выравнивается почти к нулю - как и должно).

Значит при моем способе - использующем методы класса вектор все быстрее работает? :ny_wink:

 

Кстати сегодня пока рылся в инете (поднимая свои школьные знания по математике в области векторов) наткнулся на одну интересную статью по

алгоритму отслеживания столкновений с препятствиями в игровых движках. Там упоминался метод основанный на октодереве - интересно а в сталкере какой алгоритм реализован...

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Решил получить дистанцию до объекта чистой математикой

 

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 у меня имеют разные значения? по идее должны быть равны...длина вектора между двумя точками должна быть равна расстоянию между ними. Где я тут ошибся?

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

дак я 3D геометрию изучаю (и уравнения для 3d плоскостей) и чтобы каждый раз за формулами в википедию не лазить - надо их в голове уложить - вот я вместо методов и занимаюсь математикой (понятно что в том же С++ куча готовых функций класса point, vertex, poligon - но хочется ведь еще и понимать как они работают).

 

ну с длиной вектора значит ясно в чем ошибка.

а с расстоянием то что не то? почему оно в 600 метров получается?

формула вроде правильная... тогда кстати и длина вектора такой же получится...щас проверю.

 

Monnoroch

про расстояние в посте ничего не написано.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

проверил с твоей поправкой.

Причем для сравнения сделал получение длины вектора четырьмя вариациями - все результаты совпали и - при ручном вычитании компонентов и через sub, затем через magnitude() и математически.

И на этот раз все совпало и с получаемым математически расстоянием от точки до точки.

Теперь длина вектора действительно равна расстоянию между точками - как и должно быть.

НО это ведь никак не коррелирует с реальной дистанцией... да простит меня Виет но я ничего не понимаю...

 

Елы палы - это ж у меня квадрат расстояния получается - 400 = 20 реальным в квадрате...только почему квадрат то?

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

XrAlexR

Советую для начала почитать статьи по настройке логики.

у тебя зачем стоит таймер с переходом к несуществующей секции логики?

зачем строчка meet = meet

когда самой секции meet у тебя нет?

Если берешь примеры из статей - то не бери их бездумно - там откуда ты взял эту логику - это только часть большой схемы. Если выдираешь - то выдирай правильно.

 

если NPC уходит - значит эта логика не читается. Смотри правильность указания пути до файла с логикой в кустом дате.

Анимации сидения на чем либо - типа sidya_boltaet_ 0 , stul и т.д. вырезаны - то есть надо восстанавливать.

Как - разбирай файл state_mgr_animation_list

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch

только как ее скачать - непонятно. я заходил на тот аглицкий сайт - долго ковырялся, но ссылку на скачку так и не получил.

та прога пишет все нажатия в ltx файл - а потом в нужный момент можно оттуда считать что нажата нужная клавиша.

на SP один чел тоже такую пишет - на С шарпе - но пока тесты не очень впечатляющи по его словам - много проблем.

Поделиться этим сообщением


Ссылка на сообщение

XrAlexR

Так проверь sidya_boltaet_ 0 и kurit sidya_ 0

если это все сидя на заду то других просто нет. Кроме анимок Сидора - но их ты никуда не прикрутишь.

На инсайд вики зайди - там статья есть почти по всем вырезанным анимкам - "библиотека вырезанных анимаций".

 

Поделиться этим сообщением


Ссылка на сообщение

_Призрак_

но знаю точно что 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 (стек вызов) либо даже самого списка вызовов нет - в общем ничего информативного ) все равно происходит: либо сразу,либо при наведении курсора на кнопки виджета после открытия инвентаря. не могу понять из-за чего? ведь пока не перезагрузишься все идеально...

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение
Stalk15

006 -- это не айди волка!, а его сид.

верно подмечено - не пошли на пользу все наши уроки товарисчу на СП. :-)

Stalk15

надо использовать

level_object_by_sid( sid объекта )

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...