Dennis_Chikin 3 661 Опубликовано 16 Января 2019 (изменено) Таки по дохлым и ПРОПАВШИМ квестовым неписям: 1. Смотрим в sak.script табличку local nepis = { бла-бла-бла на предмет нужного непися 2. В идеале надо еще свериться с распакованным олспавном, ибо на примере Круглова имеем аццкий косяк, на примере которого дальше и буду разбирать: Добавляем код для восстановления, например, в bind_actor.script, можно хоть в function actor_binder:__init (obj) super(obj), перед end: 3. Удаляем инфо, выдаваемые при смерти непися, например для Круглова: self.object:disable_info_portion("bar_heli_scene_professor_die") self.object:disable_info_portion("yan_scientist_die") Собственно, суть одного из косяков sak.script - тот Круглов, который на ДТ, не нужен вообще, а при смерти/пропаже Круглова на Янтаре убрать нужно оба info. 4. Проверяем, есть ли непись с этим именем вообще (собственно, распакованный оллспавн для этого потребуется в любом случае): local obj = alife():object( "yan_scientist_help" ) 5. Если нет - пересоздаем: if not obj then alife():create(8119) end spawn_id опять же брать из all.spawn, а не из скрипта. Как мы понимаем, в патчах и имена, и инфо, и spawn_id могут быть изменены в любой момент. P.S. После появления искомого непися возвращаем файл взад, если не хотим сами быть как оповцы. P.P.S. Имеет смысл заниматься восстановлением неписей (и вообще любыми операциями с чем либо) находясь на ДРУГОЙ локаци. Проверить можно и рядом с местом восстановления, а после того, как убедились, что работает - сделать уже на соседней. Иначе тот же круглов будет пытаться из бункера сбежать. Изменено 16 Января 2019 пользователем Dennis_Chikin 1 5 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 23 Января 2019 Oversized netpacket before write! [8202 > 8192] ... s\op-2.1\gamedata\scripts\binders\binder_safe.script:61 ... Предупреждали же: не пихайте все в один рюкзак. Лучше положить 10 рядом, и заполнять так, чтобы список влезал на одну страницу. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 3 Февраля 2019 (изменено) Гм, По показометру опять отсутствуют пояснения: "перемирие" - восстановление отношений с теми, кто был первоначально нейтрален, если в это время нет каких-то особых заданий. Если актор переоделся монолитовцем или пообщался с контролером до пожелтения - будут отстреливать. Если врагом стал конкретный непись - кнопку жать где-то поблизости от непися. Шерстюк/Кузнецов если стреляют ночью - так и будут стрелять ночью. Если с оным Шерстюком/Кзнецовым поссорились совсем - кнопку жать на другой локации. По "кнопке окончательной победы" - это именно кнопка окончательной победы. Проверка на то, что враг - возможно квестовый - добавлена, но срабатывать может не на всех. Пользоваться аккуратно, чтобы не сдох кто лишний. upd: ну и спавнер - думаем, что туда вписывать. То, что сейчас в списке - это образцы "как делать не надо" - то, что загонит игру в состояние заведомой непроходимости. Изменено 3 Февраля 2019 пользователем Dennis_Chikin 2 3 1 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 8 Февраля 2019 (изменено) @Alexander_Vesker, я тут подумал (хотя думать - вредно, от этого мысли в голове появляются), можно попробовать как-то так: local ini local pos = actor:position() -- actor должен быть определен где-то раньше, пока его нет в игре - не вызывать for k, v in pairs( db.creatures ) do -- что есть в онлайне if t_mobs[v:clsid()] then -- табличку с классами монстров не забываем прописать if ( not v:alive() ) and ( ( v:story_id() == 4294967296 ) or ( v:story_id() == -1 ) ) - не уникальные and v:position():distance_to_sqr( pos ) < 2500 then -- 50 метров ограничение v = sim:object( v:id() ) -- local sim = alife() где-то должно быть if v and v.looted then sim:release( v ) end -- .looted ставим в on_use монстров end elseif v:clsid() == c_npc then -- класс сталкеров прописать if ( not v:alive() ) and ( ( v:story_id() == 4294967296 ) or ( v:story_id() == -1 ) ) -- не уникальные and v:position():distance_to_sqr( pos ) < 2500 then -- ну и далее по тексту v = sim:object( v:id()) if v and v.looted then sim:release( v ) end -- .looted ставим в on_use сталкеров end end end в bind_monsters/bind_stalker дописать типа function stalker_binder:use_callback(obj, who) if self.object:alive() then ... else ... local v = alife():object( obj:id() ) if v then v.looted = true end end ... end Хотя все еще возможны всякие вылеты имени Павлика и убирание трупов, нужных для чего-нибудь странного. Попробуем сегодня. @Гасан Салихов, говорил же уже - попробовать двигаться в направлении вылета, регулярно применяя котика. Изменено 8 Февраля 2019 пользователем Dennis_Chikin 1 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 10 Февраля 2019 По поводу вылета [10.02.19 11:50:24.247] [LUA] 1 : [Lua] ...iles (x86)\op-2.1\gamedata\scripts\cycle_task.script(548) : check_task_props ... [10.02.19 11:50:24.247] [error]Arguments : Input object is nil! Посмотрел сейчас файл, в котором я лично откручивал тормоза. Строка выглядит так: end Вывод слегка очевиден. И, да, если напрячь телепатию, и погадать на кофейной гуще, то весь кусок должен выглядеть примерно так: Скрытый текст --' Проверка свойств задания на доступность к выдаче function CCycleTask:check_task_props(task_desc) --' Проверка по активным заданиям данного типа у вендора if self.active_task_by_type[task_desc.complex_type] ~= nil then task_desc.enabled_props = false return end --' Проверка по разовости if task_desc.status == self.status.once then task_desc.enabled_props = false return end --' Проверка по блоку приоритета по времени ожидания if self.current_vendor_locked_prior[task_desc.complex_type] and self.current_vendor_locked_prior[task_desc.complex_type] >= task_desc.prior then task_desc.enabled_props = false return end --' Проверка по кондлисту if task_desc.condlist and xr_logic.pick_section_from_condlist(db.actor, task_desc.condlist) == nil then task_desc.enabled_props = false return end --' Проверка по таймауту if task_desc.next_time then if task_desc.next_time >= game.hours() then task_desc.enabled_props = false return else task_desc.next_time = nil --' Время ожидания вышло end end --' Проверка по цели if task_desc.type == self.type.eliminate_lager then local strn = task_desc.target and alife():object( task_desc.target ) if strn then local g = strn.gulag if g and g:get_population_comed() >= 1 then task_desc.enabled_props = true return end else log( "cycle_tasks, invalid target: " .. ( ( task_desc.target and tostring( task_desc.target ) ) or "n/a" ) ) end task_desc.enabled_props = false return elseif task_desc.type == self.type.defend_lager then if xr_gulag.getGulagState(task_desc.defend_target) == 1 and server_object(task_desc.target).gulag:get_population_comed() > 0 then --if xr_gulag.getGulagState(task_desc.defend_target) == 0 then --' Раскомментить вместо выше для отладки этого типа ЦЗ --' В смарте есть народ и на него действительно нападают task_desc.enabled_props = true return end task_desc.enabled_props = false return elseif task_desc.type == self.type.kill_stalker then --' Нету целей if task_desc.target_objects == nil then task_desc.selected_target = nil task_desc.enabled_props = false return end --' Проверим, живы ли наши цели и могут ли выйти в онлайн local oo if task_desc.selected_target then oo = server_object(task_desc.selected_target) if oo == nil or oo.alive == nil or not oo:alive() then task_desc.selected_target = nil end end for k,v in pairs(task_desc.target_objects) do oo = server_object(v) if oo == nil or oo.alive == nil or not oo:alive() or not oo:can_switch_online() then table.remove(task_desc.target_objects, k) end end --' Не осталось целей if #task_desc.target_objects == 0 then task_desc.selected_target = nil task_desc.enabled_props = false return end --' Выбираем текущую цель задания if not task_desc.selected_target then task_desc.selected_target = table.random(task_desc.target_objects) end task_desc.enabled_props = true return else task_desc.enabled_props = true return end end Впрочем, и даже это - тоже неправильно, и переписывать надо ВСЕ. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 12 Февраля 2019 (изменено) @IIIGooGLuKIII, Когда-то, в более другой теме, писали именно про то, какие фрагменты кода, как и для чего следует изменить. Но, тема НА СТОЛЬКО всем мешала, что в итоге все-таки пришлось закрыть. Хотя да, на мой взгляд, все эти "сборники правок" более чем бессмысленны, особенно с учетом того, что накатив такой "сборник" - тут же накатывают "новый патч". @Alexander_Vesker, От меня что требуется? С нуля заново переписать мод? У меня для этого более другой есть, и там есть чем заняться, хотя все работает, и никаких айвенгов там никто не убивает за их отсутствием. Более того, исправления всех сцен в ТД для соли выкладывались 8 лет назад, ни тогда, ни за все это время они оказались никому не нужны, за исключением требований все это удалить, как нарушающие аффтырьские права всех, кого попало. Не собираюсь делать все заново, и не обязан. Кстати, да, если уж на столько припекло - game_relations.ltx, attitude_neutal_threshold = -9900, 0 для human на всех строках и столбцах в [monster_relations], и получаем щасте, потом вертаем взад. Аналогично - с "переставшим работать" котиком в неизвестно каких сборках для неизвестно чего, особенно со всякими "озвучками" и прочим блэкджеком. Идем на ютубю на сами-знаете какой канал, и видим, что таки работает. Код был выложен, все расписано. Не знаю, что еще надо. Изменено 12 Февраля 2019 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 12 Февраля 2019 (изменено) 2 часа назад, Alexander_Vesker сказал: как помирить квад долга и можно как то удалить рестрикторы в ТД где остановка перед входом в лабу х-18. Проблема в том, что я понятия не имею, кого там надо с кем мирить и зачем. Что касается рестрикторов - смотрим на карте по меткам, как называются, и удаляем обычным local obj = alife():object( "имя" ) if obj then alife():release( obj, true ) end желательно - находясь на другой локации. Опять же не представляю, зачем это надо и что получится в результате. Например, может получиться как с той антенной Кленова или еще нечто в том же духе. Проверяйте. И вот код для убиения врагов, ПОКА ЕЩЕ независимый от всех правок и патчей: Скрытый текст function kill_em_all() local actor = db.actor() if not actor then return end -- еще не загрузилась игра local max_dist = 70 * 70 -- 70 - максимальная дистанция, за которой не трогаем local t = {} for k, v in pairs( { -- вписываем классы clsid.bloodsucker_s, clsid.boar_s, clsid.dog_s, clsid.flesh_s, clsid.pseudodog_s, clsid.burer_s, clsid.cat_s, clsid.chimera_s, clsid.controller_s, clsid.fracture_s, clsid.poltergeist_s, clsid.gigant_s, clsid.zombie_s, clsid.snork_s, clsid.tushkano_s, clsid.psy_dog_s, clsid.script_stalker, } ) do t[v] = true -- заполняем так на случай, если кто-то переименует end local t_exlusive = { -- часть имени, с которым не трогаем "controller_mini", "quest_venom", "boar_child", "chimera_quest", "dog_quest", "kontrik_electro", "cat_quest", "tank_zasada", "quest_karlito", } local pos = actor:position() for k, v in pairs( db.creatures ) do -- что есть в онлайне if t[v:clsid()] -- подходит по классу and v:alive() -- живое and ( ( v:story_id() == 4294967296 ) or ( v:story_id() == -1 ) ) -- не уникальное and v:position():distance_to_sqr( pos ) < max_dist -- подходит по расстоянию then for ii, vv in ipairs( t_exlusive ) do -- не в исключениях if string.find( v:name(), vv ) then v = false; break end end if v then -- прошло все проверки if v:clsid() == clsid.script_stalker then -- непись if v:relation( actor ) == game_object.enemy then -- враг v:kill( actor ) -- убиваем end else v:kill( actor ) -- монстр, убиваем end end end end end Впрочем, подозреваю, что таким он и пару часов не останется. Я в людей верю - найдут, как сделать нерабочим. Изменено 12 Февраля 2019 пользователем Dennis_Chikin 1 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 661 Опубликовано 12 Февраля 2019 @Nightshade2, if true then ... вообще-то Пусть меняют, что хотят. Хотя да, я уверен, что в следующих патчах и еще половину команд вырежут, чтобы только поорать про "читеров криворуких". "stranger" - ну, не заметил, что его там было, вписал еще раз. Это то самое, которое "мир с бандитами" и прочими Химерами. arhara_dialog.friend_community() и тому подобное. P.S. Кстати, я бы, в целях "борьбы с читерами" еще бы и все буквы во всех операторах LUA местами переставил - благо, прецедент с перестановкой местами всех аргументов в функциях и изменением типа аргументов в более другом моде уже был - чтобы сделать несовместимым код с кодом того, у кого собственно и был взят. 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение