Перейти к контенту

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

Привет народ, чёт у меня проблемка: никак не выходит "толкнуть" артефакт. Пробовал наносить хит взрывом, передавая импульс. Но использование метода к онлайновому объекту, к примеру как к актору - не прокатывает. Есть ли какой простой способ его толкнуть?

... А наше дело маленькое - с ружьём да по болотам. (с)

Ссылка на комментарий
function kick_art_begin(sobj,dir)
	local hit = hit()
	hit.direction = dir
	hit.direction.y = hit.direction.y + 1
	hit.draftsman = db.actor
	hit.impulse = math.random(100,130)
	hit.power = 0
	hit.type = hit.strike
	level.client_spawn_manager():add(sobj.id,65535,kick,hit)
end

function kick(hit,id,obj) obj:hit(hit) end

Я так пинал его. Тут конечно надо подправить некоторые моменты, но это работает и в качестве примера вполне пойдет.

  • Спасибо 1

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

К вопросу об апдейте из bind_stalkker:

 

привычное всем if time_global() < next_update_time then простыня из вызовов 100500 функций в 100500 скриптах - это, конечно, ужасно. Особенно, если вызываемое должно срабатывать 1 раз за всю игру. Но плодить 100500 рестрикторов - тоже не вариант (на самом деле даже и 65000 не получится по понятной причине).

 

Что делать ? А подключать динамически. Точно по тому же принципу, что и известные всем "таймеры" из amk-мода и различные их вариации. Примерно вот так:

 

local tasks_list = {}    -- имя, группа( 50, 200, 1000, 5000 ), функция --

local t50, t200, t1000, t5000 = {}, {}, {}, {}        -- группы { строка для wathdog, функция }
local t50n, t200n, t1000n, t5000n = 0, 0, 0, 0        -- функций в группе
local t50i, t200i, t1000i, t5000i = 1, 1, 1, 1        -- текущая функция в группе
local t50t, t200t, t1000t, t5000t = 0, 0, 0, 0        -- время следующего обновления
local t50q, t200q, t1000q, t5000q = 50, 200, 1000, 5000    -- через сколько обновлять


function task_add( tname, tgroup, f )
    if ( tgroup or 200 ) == 200 then t200n = t200n + 1; table_insert( t200, { f, tname } )
    elseif tgroup == 1000 then t1000n = t1000n + 1; table_insert( t1000, { f, tname } )
    elseif tgroup == 5000 then t5000n = t5000n + 1; table_insert( t5000, { f, tname } )
    elseif tgroup == 50 then t50n = t50n + 1; table_insert( t50, { f, tname } )
    end
end

function task_del( tname, tgroup )
    -- log( "info", "task_delete, task: [%s], gp: %s", tname, ( tgroup or "any" ) )
    if tgroup or 200 == 200 then
        for i = 1, t200n do
            if t200[i][2] == tname then
                t200n = t200n - 1; table_remove( t200, i ); return
    end    end    end
    if tgroup or 1000 == 1000 then
        for i = 1, t1000n do
            if t1000[i][2] == tname then
                t1000n = t1000n - 1; table_remove( t1000, i ); return
    end    end    end
    if tgroup or 5000 == 5000 then
        for i = 1, t5000n do
            if t5000[i][2] == tname then
                t5000n = t5000n - 1; table_remove( t5000, i ); return
    end    end    end
    for i = 1, t50n do
        if t50[i][2] == tname then t50n = t50n - 1; table_remove( t50, i ) end
    end
end

здесь 4 таблицы по группам, в зависимости от желаемой частоты вызова: 50, 200, 1000, и 5000ms.

По нужному условию вызываем task_add(), и на вход передаем ссылку на свою функцию, имя функции (для отладки и чтобы можно было удалить, когда станет не нужна, группу апдейта (50, 200, 1000, 5000).

Когда становится не нужна - task_del( имя, группа).

 

В собственно апдейте bind_stalker делаем так:

 

function actor_binder:update( delta )
...
	if t1000i == 0 then	-- ни чем не заняты ?
		if global_time_ms >= t1000t then t1000t, t1000i = global_time_ms + t1000q, 1
			-- используем этот цикл под что-нибудь полезное
		end
	else
		gp_fn = t1000[t1000i]	-- выполняем последовательно что там еще есть
		if gp_fn then t1000i, amk.oau_watchdog = t1000i + 1, gp_fn[2]; gp_fn[1]()
		else t1000i = 0		-- и используем остаток
	end	end

 

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

 

P.S. код можно было бы организовать и "по-академичнее", но целью ставился минимальный overhead - поэтому столь монструозная функция удаления ненужного.

Изменено пользователем Dennis_Chikin
  • Полезно 1
Ссылка на комментарий

Добрый день. Старался написать функцию спавна физического объекта, но, так как с Нет Пакетом знаком плохо и писал почти от фонаря, словил вылет при запуске. Очень большая просьба: помогите кто-нибудь поправить функцию и, если можно, объяснить, в чем конкретно была проблема...

function create_physic_obj(obj_sect, obj_pos, obj_lvid, obj_gvid, obj_dir, obj_mass)
local obj = alife():create(obj_sect, obj_pos, obj_lvid, obj_gvid)
local packet = net_packet()
obj:STATE_Write(packet, 60)


-- Свойства cse_abstract
local direction = packet:r_vec3()


-- Свойства cse_alife_object
local game_vertex_id = packet:r_u16()
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()


-- Свойства cse_alife_object_physic
local mass = packet:r_float()
local physic_type = packet:r_u32()
local upd:num_items = packet:r_u8()
local upd:ph_force = packet:r_vec3()
local upd:ph_torque = packet:r_vec3()
local upd:ph_position = packet:r_vec3()
local upd:ph_rotation = packet:r_vec4()
local upd:ph_angular_vel = packet:r_vec3()
local upd:ph_linear_vel = packet:r_vec3()


-- Заполнение


-- Свойства cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_u32(level_vertex_id)
packet:w_u32(object_flags)
packet:w_stringZ(custom_data)
packet:w_u32(story_id)


-- Свойства cse_abstract
if obj_dir ~= nil then
   direction = obj_dir
    end 
packet:w_vec3(direction)


    -- Свойства cse_alife_object_physic
if obj_mass ~= nil then
   mass = obj_mass
end 
packet:w_float(mass)
packet:w_u32(physic_type)
packet:w_u8(upd:num_items)
packet:w_vec3(upd:ph_position)
packet:w_vec4(upd:ph_rotation)
packet:w_vec3(upd:ph_angular_vel)
packet:w_vec3(upd:ph_linear_vel)
packet:w_vec3(upd:ph_force)
packet:w_vec3(upd:ph_torque)


-- Считываем скорректированные параметры
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

 

 

 

Вылет:

xr_effects.script:3552: attempt to index global 'my_spawn' (a nil value)
function test_spawn_obj_1()
    local pos = vector():set(39.930305480957,8.70378112792969,-66.7609176635742)
local dir = vector():set(-9.90768057818059,1.57078802585602,-1.09473432985396)
    local lv = 102321
    local gv = 0
my_spawn.create_physic_obj("test_anim_obj", pos, lv, gv, dir, 10)
end 

 

 

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

c57d8f0c86.png

Ссылка на комментарий

Всем привет! Хочу сделать что-то типа войны группировок в Сталкер ЗП, на Затоне! Сталкеры будут воевать с бандитами... Ключевой НПС будет постепенно выдавать задания на захват ключевых точек. Со спавном отрядов бандитов в этих точках наверное справлюсь.

 

Как в диалоге с НПС спавнить отряд и отправлять его на захват определённой точки? Если отряд захватил точку, то он должен там закрепиться. Если не захватил, то задание должно считаться проваленным, но чтобы можно было повторить. Возможно такое сделать?

Ссылка на комментарий

FantomICW, Это что-то под Artos'овские скрипты или типа того ?
 
my_spawn.script не скомпилился.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

@Dennis_Chikin, ну, наверное, что-то в роде того, только я здесь комплект m_netpk.script от Artos'а не задействую...Но, если знаешь, как с помощью этого скрипта реализовать функцию, то такое вполне сойдет. 

Также подойдет функция, которая может повернуть уже заспавненный объект, т. е. альтернатива параметра direction в алл.спавн-секции.

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

c57d8f0c86.png

Ссылка на комментарий

ну тогда вот это - local upd:num_items = packet:r_u8() - явно что-то странное. Как и packet:w_u8(upd:num_items).

 

И вообще: https://dl.dropboxusercontent.com/u/27871782/amk_netpk.script

 

Заточено под скорость, а то в amk/xrs оно все из себя весьма неторопливое.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
Ссылка на комментарий

Раз уж пошла речь про скорость, и дабы мне не изобретать велосипед в очередной раз (а вдруг его кто-то изобрел уже?)
Задам такой вопрос: А занимался ли кто оптимизацией массового входа неписей в онлайн?

т.е. ситуация: подходит игрок/гг к некому гулагу, в котором живет толпа неписей. И в какой то момент они всей толпой вваливаются в онлайн... создавая то, что даже словом "тормоза" назвать как то неудобно.

Взять да перекинуть выполняемые при нет-спавне неписей действия в динамический список вроде того что упомянут несколькими постами выше. Как мне представляется, это могло бы решить проблему, но возможно возникновение других проблем из-за "отложенного" (запоздалого) выполнения действий, которые, быть может, движок ожидает сразу же.

Это все лишь мои теоретические размышления. Занимался ли кто-нибудь данным вопросом на практике?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Подобная тема обсуждалась здесь. Возможно, сможешь найти полезную для себя информацию.

Да, то же самое.
И, действительно, накладные расходы на вызовы метода по сравнению с вызовом функции весьма велики. Но звук жрет больше. dc

Изменено пользователем Dennis_Chikin
  • Полезно 2
Ссылка на комментарий

Всем привет ребята. Интересует такой вопрос: Можно ли как-то отследить в какую часть тела ГГ попала пуля? Есть функция Колмогора .

if bone_index>0 and who then
  local kuda = ""
  if bone_index == 14 or bone_index == 15 then 
    kuda = "Ранен в глаз"
  elseif bone_index == 16 or bone_index == 13 then 
    kuda = "Ранен в голову"
  elseif bone_index == 17 then 
    kuda = "Ранен в шею"
  elseif bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 18 then 
    kuda = "Ранен в грудь"    
  elseif bone_index >= 1 and bone_index <= 8 then 
    kuda = "Ранен в ногу"    
  elseif bone_index >= 19 and bone_index <= 42 then 
    kuda = "Ранен в руку"
  end
  news_manager.send_tip(db.actor, kuda, nil, nil, 1000)
end

 

 

 

Но эта функция применима только на НПС.

Ссылка на комментарий

Можно, если использовать xray extensions и включить actor_hit callback. Напомню что в ЗП индексы костей изменились за счет добавления двух новых, а для ТЧ функция колмогора работает.

Ссылка на комментарий

Ребят, здравствуйте всем. Вопрос для кого то покажется банальным, но к сожалению на форуме я подобного не нашел. Как работать с прогресс баром? Если можно то пример, если нельзя, то хотя бы в двух словах, можно ли передавать туда значения на апдейте, что бы шкала росла? И вообще есть ли функции подобного рода? 
Просто если его не существует, придется писать вручную систему проверки значений и "дорисовки палочек" (замены статиков на худе) на апдейте, что весьма муторно, особенно если учесть что прогресс бары нужны в многих местах... Заранее спасибо.

Ссылка на комментарий

 

 

но к сожалению на форуме я подобного не нашел. Как работать с прогресс баром?

Справочник по функциям и классам -> Оконные классы. Сложно не найти....

Класс недоэкспортирован в ТЧ, следовательно работать - никак. В ЗП - можно.

Ссылка на комментарий
@mumie, смотри в lua_help доступные для этого класса методы. В основном по их названию понятно предназначение. Класс, вроде, называется CUITrackBar.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Доброго времени суток  :)

Есть ли способ обновить скриптовое окно? Допустим произошли там какие-то изменения, и обновить окошко, чтобы они отразились сразу, а не после закрытия/открытия.

Ссылка на комментарий

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

Ссылка на комментарий

Класс недоэкспортирован в ТЧ, следовательно работать - никак. В ЗП - можно.

Кривая инфа из луа_хелпа - не показатель. Все методы есть и в ТЧ, юзай метод SetProgressPos для изменения значения прогресс-бара.
  • Спасибо 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...