Dennis_Chikin 3 658 Опубликовано 28 Июля 2014 Поделиться Опубликовано 28 Июля 2014 bind_stalker же. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Max_Raf 35 Опубликовано 29 Июля 2014 Поделиться Опубликовано 29 Июля 2014 Привет народ, чёт у меня проблемка: никак не выходит "толкнуть" артефакт. Пробовал наносить хит взрывом, передавая импульс. Но использование метода к онлайновому объекту, к примеру как к актору - не прокатывает. Есть ли какой простой способ его толкнуть? ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
Desertir 202 Опубликовано 29 Июля 2014 Поделиться Опубликовано 29 Июля 2014 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 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 (изменено) К вопросу об апдейте из 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 - поэтому столь монструозная функция удаления ненужного. Изменено 2 Августа 2014 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
FantomICW 678 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 (изменено) Добрый день. Старался написать функцию спавна физического объекта, но, так как с Нет Пакетом знаком плохо и писал почти от фонаря, словил вылет при запуске. Очень большая просьба: помогите кто-нибудь поправить функцию и, если можно, объяснить, в чем конкретно была проблема... 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 Изменено 2 Августа 2014 пользователем FantomICW Ссылка на комментарий
Николай12 7 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 Всем привет! Хочу сделать что-то типа войны группировок в Сталкер ЗП, на Затоне! Сталкеры будут воевать с бандитами... Ключевой НПС будет постепенно выдавать задания на захват ключевых точек. Со спавном отрядов бандитов в этих точках наверное справлюсь. Как в диалоге с НПС спавнить отряд и отправлять его на захват определённой точки? Если отряд захватил точку, то он должен там закрепиться. Если не захватил, то задание должно считаться проваленным, но чтобы можно было повторить. Возможно такое сделать? Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 (изменено) FantomICW, Это что-то под Artos'овские скрипты или типа того ? my_spawn.script не скомпилился. Изменено 2 Августа 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
FantomICW 678 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 (изменено) @Dennis_Chikin, ну, наверное, что-то в роде того, только я здесь комплект m_netpk.script от Artos'а не задействую...Но, если знаешь, как с помощью этого скрипта реализовать функцию, то такое вполне сойдет. Также подойдет функция, которая может повернуть уже заспавненный объект, т. е. альтернатива параметра direction в алл.спавн-секции. Изменено 2 Августа 2014 пользователем FantomICW Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Августа 2014 Поделиться Опубликовано 2 Августа 2014 (изменено) ну тогда вот это - local upd:num_items = packet:r_u8() - явно что-то странное. Как и packet:w_u8(upd:num_items). И вообще: https://dl.dropboxusercontent.com/u/27871782/amk_netpk.script Заточено под скорость, а то в amk/xrs оно все из себя весьма неторопливое. Изменено 2 Августа 2014 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Zander_driver 10 334 Опубликовано 6 Августа 2014 Поделиться Опубликовано 6 Августа 2014 Раз уж пошла речь про скорость, и дабы мне не изобретать велосипед в очередной раз (а вдруг его кто-то изобрел уже?)Задам такой вопрос: А занимался ли кто оптимизацией массового входа неписей в онлайн? т.е. ситуация: подходит игрок/гг к некому гулагу, в котором живет толпа неписей. И в какой то момент они всей толпой вваливаются в онлайн... создавая то, что даже словом "тормоза" назвать как то неудобно. Взять да перекинуть выполняемые при нет-спавне неписей действия в динамический список вроде того что упомянут несколькими постами выше. Как мне представляется, это могло бы решить проблему, но возможно возникновение других проблем из-за "отложенного" (запоздалого) выполнения действий, которые, быть может, движок ожидает сразу же. Это все лишь мои теоретические размышления. Занимался ли кто-нибудь данным вопросом на практике? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Painter 3 406 Опубликовано 6 Августа 2014 Поделиться Опубликовано 6 Августа 2014 (изменено) Подобная тема обсуждалась здесь. Возможно, сможешь найти полезную для себя информацию.Да, то же самое.И, действительно, накладные расходы на вызовы метода по сравнению с вызовом функции весьма велики. Но звук жрет больше. dc Изменено 6 Августа 2014 пользователем Dennis_Chikin 2 Портфолио Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 6 Августа 2014 Поделиться Опубликовано 6 Августа 2014 http://www.amk-team.ru/forum/index.php?showtopic=8830&p=763618 отсюда и далее. Скрипты брать с последней страницы. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 7 Августа 2014 Поделиться Опубликовано 7 Августа 2014 Всем привет ребята. Интересует такой вопрос: Можно ли как-то отследить в какую часть тела ГГ попала пуля? Есть функция Колмогора . 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 Но эта функция применима только на НПС. Ссылка на комментарий
Andrey07071977 18 Опубликовано 7 Августа 2014 Поделиться Опубликовано 7 Августа 2014 Можно, если использовать xray extensions и включить actor_hit callback. Напомню что в ЗП индексы костей изменились за счет добавления двух новых, а для ТЧ функция колмогора работает. Ссылка на комментарий
mumie 2 Опубликовано 7 Августа 2014 Поделиться Опубликовано 7 Августа 2014 Ребят, здравствуйте всем. Вопрос для кого то покажется банальным, но к сожалению на форуме я подобного не нашел. Как работать с прогресс баром? Если можно то пример, если нельзя, то хотя бы в двух словах, можно ли передавать туда значения на апдейте, что бы шкала росла? И вообще есть ли функции подобного рода? Просто если его не существует, придется писать вручную систему проверки значений и "дорисовки палочек" (замены статиков на худе) на апдейте, что весьма муторно, особенно если учесть что прогресс бары нужны в многих местах... Заранее спасибо. Ссылка на комментарий
AndreySol 215 Опубликовано 7 Августа 2014 Поделиться Опубликовано 7 Августа 2014 но к сожалению на форуме я подобного не нашел. Как работать с прогресс баром? Справочник по функциям и классам -> Оконные классы. Сложно не найти.... Класс недоэкспортирован в ТЧ, следовательно работать - никак. В ЗП - можно. Ссылка на комментарий
naxac 2 447 Опубликовано 8 Августа 2014 Поделиться Опубликовано 8 Августа 2014 @mumie, смотри в lua_help доступные для этого класса методы. В основном по их названию понятно предназначение. Класс, вроде, называется CUITrackBar. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kondr48 314 Опубликовано 8 Августа 2014 Поделиться Опубликовано 8 Августа 2014 Доброго времени суток Есть ли способ обновить скриптовое окно? Допустим произошли там какие-то изменения, и обновить окошко, чтобы они отразились сразу, а не после закрытия/открытия. Ссылка на комментарий
Charsi 440 Опубликовано 8 Августа 2014 Поделиться Опубликовано 8 Августа 2014 Открытое скриптовое окно само автоматически обновляется с частотой рендера, поэтому изменения в нем отображаются моментально. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
RayTwitty 508 Опубликовано 8 Августа 2014 Поделиться Опубликовано 8 Августа 2014 Класс недоэкспортирован в ТЧ, следовательно работать - никак. В ЗП - можно.Кривая инфа из луа_хелпа - не показатель. Все методы есть и в ТЧ, юзай метод SetProgressPos для изменения значения прогресс-бара. 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти