dsh 3 824 Опубликовано 13 Октября 2017 Поделиться Опубликовано 13 Октября 2017 (изменено) @Graff46 это тебе в исходники надо лезть, выяснять. Я не встречал никакого описания для action(), ни вменяемого, ни невменяемого. Каждый раз приходиться из исходников эту информацию по крупицам вытаскивать. А штука эта мощная, на мой взгляд. Изменено 13 Октября 2017 пользователем dsh dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Graff46 598 Опубликовано 13 Октября 2017 Поделиться Опубликовано 13 Октября 2017 11 минут назад, dsh сказал: это тебе в исходники надо лезть Я плохо разбираюсь в си подобных, тем более анализировать их код... Для общего достояния, разбирающиеся люди, описали бы класс в теме по функциям и классам... Ссылка на комментарий
Graff46 598 Опубликовано 13 Октября 2017 Поделиться Опубликовано 13 Октября 2017 Если у кого то есть информация по скриптовому управлению машинами, просьба описать в теме по транспорту и технике... Ссылка на комментарий
HellRatz 2 814 Опубликовано 13 Октября 2017 Поделиться Опубликовано 13 Октября 2017 Таак.. Вопросы такие. Как: 1) Удалить оружие из инвентаря НПС? Использую: for a = 1,65534 do local se_obj = alife():object(a) if se_obj and se_obj:section_name() == "wpn_saiga_uniq" then alife():release(se_obj, true) end end и вот эта самая сайга уник (создана специально, чтобы игра не удалила все сайги из игры) не удалятся из-за спины НПСа (нужно чтобы НПС как бы потерял оружие и не мог стрелять - тупо удалить его), хотя сама функция вроде-бы рабочая. 2) Заспавнить НПСу оружие в инвентарь, чтобы он мог его использовать? Юзаю такую ф-ю: for k,v in pairs(db.storage) do local obj = level.object_by_id(k) if obj then if obj:profile_name()=="npc_name" then ogse.spawn_item_in_inv("wpn_saiga",obj) break end end end , оружие вроде бы спавнится, но после сейв/лоад оно опять исчезает у него из рюкзака. Само оружие не прописано спавном в профиль, возможно из-за этого. Что можно сделать с этим? GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
Капрал Хикс 517 Опубликовано 13 Октября 2017 Поделиться Опубликовано 13 Октября 2017 (изменено) Дано: скриптовая эмуляция невидимых слотов (нож, болт, ПДА, бинокль). У меня два бинокля и при попытке вставить бинокль в слот, где уже есть другой, происходит движковый вылет, лог,: Скрытый текст 0023:0494C077 xrGame.dll 0023:0494C513 xrGame.dll 0023:049A8C3A xrGame.dll 0023:049A7BD6 xrGame.dll 0023:049892B0 xrGame.dll 0023:049A91B0 xrGame.dll 0023:049892B0 xrGame.dll 0023:0494AC39 xrGame.dll 0023:04A111DC xrGame.dll 0023:04737410 xrGame.dll Есть ли где подсмотреть готовое решение / костыль / затычку от вылета? Поиском решение не нашёл, DMX мод пока не предлагать, там немного другая система реализации скриптовых слотов, нежели Кираговская, попытки совместить решения оттуда не увенчались успехом. Изменено 14 Октября 2017 пользователем Капрал Хикс Ссылка на комментарий
naxac 2 445 Опубликовано 14 Октября 2017 Поделиться Опубликовано 14 Октября 2017 @HellRatz, попробуй так local obj = npc:object( "wpn_saiga_uniq" ) if obj then local sobj = alife():object( obj:id() ) if sobj then alife():release( sobj, true ) end end npc - это непись, у которого забираем пушку local wpn = alife():create( "wpn_saiga", vector():set( 0, 0, 0 ), 0, 0, obj:id() ) level.client_spawn_manager():add( wpn.id, 0, function( npc, id, obj ) npc:transfer_item( obj, npc ) end, obj ) Тут obj - непись, которому спавним оружие. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dsh 3 824 Опубликовано 19 Октября 2017 Поделиться Опубликовано 19 Октября 2017 Народ, кто разбирается в математике, подскажите пожалуйста. Вот есть у меня два вектора: направление на объект и направление камеры. И есть у меня угол между этими векторами. Так вот, мне нужно определить, что камера смотри на этот объект. Я могу считать, что если камера на расстоянии 2-ух метров от объекта и угол между этими векторами меньше, скажем, 0.3, то камера смотрит на объект. Но если расстояние будет уменьшаться, ведь допустимый угол должен увеличиться, т.к. объект становится больше в камере. Как мне посчитать этот угол для меньшего расстояния, если я задаю, что на расстоянии 2 метра он должен быть меньше 0.3? dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
abramcumner 1 145 Опубликовано 19 Октября 2017 Поделиться Опубликовано 19 Октября 2017 Считаешь, что вокруг центра объекта у тебя сфера радиусом Radius() + N. Находишь пересечение направления камеры и этой сферы. Если пересекаются, значит камера смотрит на объект. N подбираешь, как удобней. Может быть N будет вообще 0 и хватит движкого Radius. 1 Ссылка на комментарий
dsh 3 824 Опубликовано 19 Октября 2017 Поделиться Опубликовано 19 Октября 2017 @abramcumner я правильно этот пример перевел на lua? function is_actor_looking_to_pos( pos, radius ) local k = vector():sub( pos, device().cam_pos ):normalize() local b = k:dotproduct( device().cam_dir ) local c = k:dotproduct( k ) - radius * radius local d = b * b - c if d >= 0 then local sqrtfd = math.sqrt( d ) local t1 = -b + sqrtfd local t2 = -b - sqrtfd local min_t = math.min( t1, t2 ) local t = min_t > 0 and min_t or math.max( t1, t2 ) return t > 0 end return false end dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
abramcumner 1 145 Опубликовано 19 Октября 2017 Поделиться Опубликовано 19 Октября 2017 @dsh, нормализация не нужна. И иф не нужен(если тебе не нужна точка пересечения). То есть как-то так будет: function is_actor_looking_to_pos( pos, radius ) local k = vector():sub( pos, device().cam_pos ) local b = k:dotproduct( device().cam_dir ) local c = k:dotproduct( k ) - radius * radius local d = b * b - c return d >= 0 end 1 Ссылка на комментарий
nasar75 3 868 Опубликовано 20 Октября 2017 Поделиться Опубликовано 20 Октября 2017 (изменено) Консультация нужна.... В-общем, не секрет. что в Сталкере иногда у объектов\рестрикторов зависает (равна нулю) логика. Простой пример - на двери Сидоровича нет надписи "Открыть" - дверь открывается только выстрелом из дробовика. В НС 201 камрад lsclon решила эту проблему. Например, из bind_physic_object.script было Скрытый текст function generic_physics_binder:load(reader) self.loaded = true object_binder.load(self, reader) xr_logic.load_obj(self.object, reader) end Стало: function generic_physics_binder:load( reader ) object_binder.load( self, reader ) xr_logic.load_obj( self.object, reader ) -- если потерялась логика -- lsclon -- if self.st.loaded_ini_filename then self.loaded = true end end Я перенес эти правки в bind_physic_object.script, bind_heli.script, bind_restrictor.script в мод 2золотой Шар" - работает - логика восстанавливается.А вот в ЧН функция generic_physics_binder:load(reader) выглядит по другому: Скрытый текст function generic_physics_binder:load(reader) self.loaded = true printf("generic_physics_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) set_save_marker(reader, "load", false, "physics_binder") xr_logic.load_obj(self.object, reader) set_save_marker(reader, "load", true, "physics_binder") end Я её изменил таким образом: function generic_physics_binder:load(reader) -- self.loaded = true printf("generic_physics_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) set_save_marker(reader, "load", false, "physics_binder") xr_logic.load_obj(self.object, reader) set_save_marker(reader, "load", true, "physics_binder") if self.st.loaded_ini_filename then self.loaded = true end end логика объектов\рестрикторов восстанавливается, но вопрос всё же есть - правильно ли я сделал? И еще вопрос - можно ли эту проверку добавлять в bind_monster.script: function generic_object_binder:load(reader) self.loaded = true set_save_marker(reader, "load", false, "generic_object_binder") object_binder.load(self, reader) xr_logic.load_obj(self.object, reader) if self.object:clsid() == clsid.script_trader then trade_manager.load(self.object, reader) end set_save_marker(reader, "load", true, "generic_object_binder") end Изменено 20 Октября 2017 пользователем nasar75 AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64 правки Золотой Шар Ссылка на комментарий
dsh 3 824 Опубликовано 20 Октября 2017 Поделиться Опубликовано 20 Октября 2017 @nasar75 я бы посоветовал не заниматься борьбой с последствиями, а один раз исправить причину этого. Вот тут можно посмотреть, в чем причина и один из вариантов исправления: https://github.com/dsh2dsh/op2ogse/commit/f726609396ce7115ee4cd86fcc7cc7a314cf1349 4 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
nasar75 3 868 Опубликовано 20 Октября 2017 Поделиться Опубликовано 20 Октября 2017 (изменено) @dsh дык это понятно - проще не допустить болесть, чем её лечить. НО авторы модов почему-то не учитывают этого, и в сейв пишутся объекты с нулевой логикой. А потом игроки пишут: Скрытый текст Помогите, не работает дверь на Свалку! Помогите, нет рычага для опускания моста! Помогите. не приходит смс в нужном месте! Помогите, прихожу в церковь - а ничего не происходит!!! И вопрос таки повторю - правильно ли я вставил код проверки? да, а скрипт проверки логики из ОП-2 я пихаю во все моды сразу - с небольшой модификацией - без abort ( обычно это вылет на первом объекте), но с проверкой рестрикторов Скрытый текст -- сообщение по побившейся логике физобъектов и вертолетов local s_ini = obj:spawn_ini() if not st.ini_filename and s_ini and logic_not_empty(obj, s_ini) then if obj:clsid() == clsid.script_phys or obj:clsid() == clsid.script_heli or obj:clsid() == clsid.script_restr -- or ((IsMonster[obj:clsid()] or IsStalker[obj:clsid()]) and obj:alive()) -- or ((IAmAStalker[obj:clsid()] or IAmAMonster[obj:clsid()]) and obj:alive()) then news_manager.send_tip(db.actor,"У объекта "..obj:name().." повисла логика.") dbglog("У объекта "..obj:name().." повисла логика.") -- printf("У объекта "..obj:name().." повисла логика.") -- abort("У объекта "..obj:name().." повисла логика.") -- if not amk.has_timer("no_save") and not db.debug then -- amk.start_timer("no_save", 5) -- amk.start_timer("zonedocs_gg_kill",3,0) -- end end end ..... -- у объекта есть "непустая" логика function logic_not_empty(npc, ini) return ini:section_exist("logic") and ( ini:line_exist("logic", "cfg") or (ini:line_exist("logic", "active") and ini:r_string("logic", "active") ~= "nil") ) end Изменено 20 Октября 2017 пользователем nasar75 1 AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64 правки Золотой Шар Ссылка на комментарий
dsh 3 824 Опубликовано 20 Октября 2017 Поделиться Опубликовано 20 Октября 2017 @nasar75 ну дык я же как раз и показал решение, что бы в сейв не писалась нулевая логика. Тогда не понадобится все остальное. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
shahvkit 3 517 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 Добрый день. Чтобы через скрипт ui_main_menu.script получить определённую сумму денег надо в elseif dik==DIK_keys.DIK_F3 then self:ppe_menu_show() заменить self:ppe_menu_show() на db.actor:give_money(1000) Как изменить строку db.actor:give_money(1000) чтобы получить какой либо предмет ? Например водку или патроны. Ссылка на комментарий
Kirgudu 1 204 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 @shahvkit, alife():create(section, vector(), 0, 0, db.actor:id()) 1 Инструмент Ссылка на комментарий
Jekyll 92 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 Здравствуйте. Нужно удалить НПС или монстра при попадании в него из оружия. На сколько я знаю, методом :release() можно удалять только неживые объекты. Есть такой кусочек кода (только не бейте если что): Скрытый текст if mob then if mob:alive() and mob:who_hit_name()=="single_player" then mob:kill(mob) alife():release(alife():object(mob:id()),true) Насколько этот кусочек стабилен и не вызовет ли он в дальнейшем проблем (вроде боя сейвов)? Есть ли способ удалить живой объект без таких последствий? И еще: аналогичен ли способ "mob:kill(mob)" способу "mob.health = 0"? New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий
Graff46 598 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 4 часа назад, Jekyll сказал: можно удалять только неживые объекты Живые можно Ссылка на комментарий
Graff46 598 Опубликовано 24 Октября 2017 Поделиться Опубликовано 24 Октября 2017 4 часа назад, Jekyll сказал: методом :release() можно удалять только неживые объекты Живые можно удалять так Ссылка на комментарий
AndreySol 215 Опубликовано 25 Октября 2017 Поделиться Опубликовано 25 Октября 2017 9 часов назад, Jekyll сказал: Насколько этот кусочек стабилен и не вызовет ли он в дальнейшем проблем (вроде боя сейвов)? mob:kill(mob) alife():release(alife():object(mob:id()),true) Весь Сталкер построен на апдейтах(обновление по таймеру с определенным интервалом), соответственно движку, что бы выполнить какое-то сложное действие над объектом, требуется один\несколько апдейтов. А твой код будет выполнен в один апдейт, соответственно метод kill не будет полноценно обработан для объекта, и он будет сразу удален. Если у тебя этот моб будет под гулаговой логикой или в моде используется какая-то схема, которая прописывает рестрикторы мобам - будет вылет или зависание в скриптах(= битый сейв). Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти