*Shoker* 322 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) Какая игра? По идее трупы монстров должны попадать в общий чистильщик (правда я не видел, где это происходит, так что не уверен, кто в курсе как именно игра их удаляет?) и пропадать по превышению определённого кол-ва тел. Функцию можешь такую: function clear_monster_corpses() for id = 1, 65534 do local obj = level.object_by_id(id) if obj~=nil and isMonster(obj) and not obj:alive() then local sobj = alife():object(id) alife():release(sobj, true) end end end Это грубый вариант, при его вызове будут удалены все трупы монстров, которые в данный момент в онлаине и есть на текущей локации. То же касается квестовых трупов монстров (хотя таковых в оригинале я не припомню ) Так что учти если что. Кстати, а существует ли способ удалить объект из игры, не получая его серверного объекта? SibireaStalker ЗП? Тогда квест вроде правильно вызываешь, а вообще стоит сперва попробовать самому вызвать в игре, а если не работает, то тогда уже писать тут. Изменено 22 Сентября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) *Shoker*, учитывая, что все монстры 'биндятся', а это значит, что заносятся в таблицу db.storage, итерировать по всему списку игровых ID расточительно. Достаточно: for id,v in pairs(db.storage) do if level.object_by_id(id) then local sobj = alife():object(id) if sobj and IsMonster(sobj) and not sobj:alive() then alife():release(sobj, true) end end end Добавлено через 4 мин.: Meller, имеются наработки модмейкеров по написанию 'чистильщиков' локаций, которые встречаются почти в каждом 'глобальном' моде. Не сложно взять из них часть относящуюся к монстрам и выделить в отдельную функцию с требуемым тебе результатом. Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
лнкс 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Можно ли как-то отключить удаление лута из инвентаря трупов, путём редактирования death_manager.script? Лучше спросить глупость, чем её совершить. Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 лнкс Разберись о чем говоришь и что отключать хочешь - тогда переформулируй вопрос. Loot - ограбление/грабить/мародерствовать В игре под 'лутом' подразумевается: удаление части предметов находящихся в трупе и доспавн в труп некоторого набора предметов, которых в трупе не было. Т.о. "удалить лут из инвентаря" невозможно, т.к. это действие (удаление+спавн). Игроки, часто употребояют под 'лутом' именно то, что доспавнивается в труп, что тем более удалить невозможно, т.к. еще и не спавнилось. Можно - а) не удалять предметы из трупа, можно - б) не спавнить предметы в труп, можно - с) и то и другое (т.е. отменить лут). Соответственно и пути решения различны. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
лнкс 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Удаляются ножи, пда, фонарики,детекторы и прочее. Меня интересует отмена этого удаления. Теперь понятно? Лучше спросить глупость, чем её совершить. Ссылка на комментарий
TimeShift 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Как выдать квест через логику при вхождении в определенный смарт 1. Прочти п.6 в шапке темы. 2. Если ты ждешь готовой статьи или готового кода для твоего решения - думаю что врядли дождешься. Почитай на интересующую тебя тему статьи про логику, квесты ... И когда что-то начнешь делать и не будет получаться - задавай вопросы по сделанному тобою и по тому, что же не выходит. --/ Artos Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) лнкс Для однозначного понимания вопроса нехватает еще малости - читаем в шапке: 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; Поэтому привожу только один вариант применительно к версии игры ТЧ: В скрипте 'death_manager.script' в строке 177 (в самом конце функции 'keep_item') закомментируй (поставь впереда строки '--') так: --alife():release(alife():object(item:id()), true) Если иная версия игры иль правленый файл (из мода) - делай по аналогии. Понятно? Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
dark_stalker 2 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Здравствуйте у меня происходит вылет когда заканчивается монолог сидора вот с таким логом Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...hadow of chernobyl\gamedata\scripts\state_mgr.script:145: C stack overflow помогте опредилить почкму вылет? Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) dark_stalker Это один из трудно выявляемых типов ошибки. Поиск причины возможен только на конкретных кодах мода. Где-то в кодах у тебя образовалась зацикленность, что приводит к переполнению стека. Искать и разрывать цикл. Подспорьем может быть определение объекта (имени) в том эвалуаторе из 'state_mgr.script' на который указывает запись в логе и искать циклы связанные с этим объектом. Но, вполне возможно, что спавнится некий объект (НПС/моб) по некорректной позиции (типа "в стене") и не может выбраться ... Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
dark_stalker 2 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) А какой имено обьект опредилить возможно? Это может быть из за того что я аи сетку изминил? Изменено 23 Сентября 2011 пользователем dark_stalker Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Не 'какой', а 'как'. Тебе нужен именно тот, для которого зациклились вызовы стейт-менеджера. Какой именно - только самому смотреть и анализировать. Выведи в лог имя объекта 'self.object:name()' в том эвалуаторе, к которому принадлежит строка указанного в логе ошибки - получишь всех, которые движутся. По часто и/или последнему упоминающемуся имени и ищи ... Ну и естественно, сменив сетку AI следует перепроверить/скорректировать все координаты ... Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Как узнать код клавиши из user.ltx? Поясню: Нужно чтобы при нажатии кнопки открытия второго слота активировалась функция. Функция для того чтобы отследить нажатие какой либо клавиши у меня есть, но я не знаю как узнать на какую клавишу игрок установил активирование второго оружейного слота Freedom Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) _Призрак_ Прочитать файл 'user.ltx' и из него взять значение интересующего тебя параметра (bind wpn_2 k2). Можно это делать один раз на старте игры, но ... игрок в процессе игры может перебиндить - значит перечитывать стоит 'по выходу' из главного меню. function Read_ScreenResolution() get_console():execute("cfg_save tmp") --/ копия/запись настроек из 'user.ltx' в файл 'tmp.ltx' local f = getFS() --/ объект класса FS local oFile = f:exist("$app_data_root$","tmp.ltx") local iSize = oFile and oFile.size_real --/ размер файла (байт) if iSize and iSize > 0 and iSize < 8192 then --/ ограничитель размера 'читалки' local oReader = f:r_open(oFile.name) --/ объект/линк 'читалки файла' if oReader then local tSymbols,iByte,i = {},0,0 --/ временный массив и переменные для чтения --/ последовательно по-байтно читаем от начала и до конца файла (или до NULL) oReader:r_seek(0) --/ устанавливаем 'читалку' в начало for i=1,iSize do iByte = oReader:r_u8() --/ читаем текущий байт if iByte == 0 then --/ нуль-терминатор? (NULL == 0x00) break --/ прерываем чтение end table.insert(tSymbols, string.char(iByte)) --/ конвертируем байт в символ и добавляем в таблицу end local sStr = table.concat(tSymbols) --/ конкатенация всех символов в единую строку --/ вырезаем из строки файла значение искомого параметра local sVidMode = sStr:match('vid_mode%s*(%w+)') if sVidMode and sVidMode ~= "" then --/ обнаружен? print("Read_ScreenResolution:VidMode=[%s]:[%s]", sVidMode, sVidMode, ">") --/> Прочитали!!! end end f:file_delete(oFile.name) --/ удаляем tmp-файл end end Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Lagos 688 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 (изменено) Здраствуйте. Вот создал нового торговца в ЗП, и прописал ему такую логику: [logic] prior = 200 active = remark danger = danger_ignore level_spot = trader can_select_weapon = false trade = misc\trade\trade_otshel.ltx [danger_ignore] ignore_distance = 5 [remark] no_move = true (Если я не ошибаюсь, то торговец должен торговать и стоять на месте.) Но при подходе к торговцу получаю вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....e.r. - Cia I?eiyoe\gamedata\scripts\xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil) (Опять же, как я правильно понял, это неверная логика.) Подскажите, в чём моя ошибка? Заранее спасибо. Изменено 26 Сентября 2011 пользователем Artos Официальный сайт . Ссылка на комментарий
Ulman 5 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 Всем доброго времени суток! У меня вот такая проблема, я уже писал про неё, но ответов так и не получил. Дело вот в чём, у меня стоит Медицинская резинка и спецназовские часы от Вергаса и я заметил такую "пакость" очень часто, когда я лечу раненных товарищей, то они благодарят, становятся друзьями, пытаются встать на ноги и сразу же падают, то есть их аптечка не вылечила. Вот как это исправить, очень нужно, заранее спасибо! P.S. Пытался обращаться к автору мода, но к сожалению его очень давно нет на форуме, с июня этого года. Ссылка на комментарий
Artos 99 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 (изменено) Ulman, так ты будешь о-о-очень долго спрашивать. Ни версии игры не указал, ни что за солянку себе сделал. Если тебе знакома резиновая аптечка иль спец-часики, то кому-то они совершенно не знакомы, и не лишним бы были ссылки на коды этих примочек. Вот тогда, может и найдутся те, кто подскажет как исправлять. Ну а пока немного общей теории и далее ковыряй самостоятельно: В исходной игре, если дать раненому аптечку, то его здоровье должно увеличиться, схема ранения сбрасывается и НПС встает. Однако, если величина увеличения здоровья ('eat_health'), которую дает съеденная аптечка недостаточна для достижения порогового значения, по которому определяется ранен ли НПС - то вновь включится схема ранения и НПС примет соответствующую позу. "Резиновая аптечка", как помнится, именно и предназначена для затягивания процесса выздоравливания (хотя вроде только для актора). Если она (аптечка) в своем конфиге имеет малое значение 'eat_health' - то и не будет вылечивать 'за раз'. Добавлено через 16 мин.: zoidberg123456789, искать нужно в иных кодах, чем процитированная тобою логика. Строка лога ошибки: 'xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil)' - говорит о том, что в функцию xr_logic.parse_condlist(npc, section, field, src) не был передан аргумент 'src' (т.е. некое значение параметра для некоей схемы). Попробуй в начало функции 'parse_condlist' поставить вывод в лог значений npc:name(), section, field - тогда сможешь понять, для какого НПС из какой схемы и в каком параметре у тебя ошибка. Изменено 26 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 Ulman Из того что приходит в голову 1) В случае лечения нпс через диалог, вызывать функцию которая принудительно восстановит здоровье непися до нормы 2) При передаче "резиновой аптечки" нпсу, заменять ее на "обычную", которая восстанавливает здоровье как в чистой игре. У меня в своей реализации постепенно действующих аптечек сделано по второму методу function relocate_item_section(victim, section, type) if db.actor and victim then if type == "in" then --' Трансферить нужно только квестовые предметы. if quest_section[section] == true and victim:object(section) ~= nil then victim:transfer_item(victim:object(section), db.actor) else alife():create(section, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end elseif type == "out" then if section == "two_medkit" then twoteam_usetime.relocate_medkit("two_medkit", "medkit", victim) elseif section == "two_medkit_army" then twoteam_usetime.relocate_medkit(section, "medkit_army", victim) elseif section == "two_medkit_scientic" then twoteam_usetime.relocate_medkit(section, "medkit_scientic", victim) else db.actor:transfer_item(db.actor:object(section), victim) end end news_manager.relocate_item(db.actor, type, section) end end function relocate_medkit(section, target_section, target) twoteam.set_rundrop_data(true) local medobj = db.actor:object(section) if medobj == nil then return end if alife() then local seobj = alife():object(medobj:id()) if seobj then alife():release(seobj, true) end spawn.inv(target_section, target:id()) end end Вместо set_rundrop_data у Варгаса, полагаю, что-то свое, если его способ реализации похож на мой (до сих пор в глаза не видел, так что понятия не имею), в любом случае трогать это ненадо, к делу не относится. Вопрос такой, при удалении методом alife():release некоторые объекты надо переводить в оффлайн, некоторые можно прямо из онлайна удалять. Кто-нибудь занимался сбором информации, какие надо а какие-нет? Понимаю, вопрос лениво выглядит, но нехватка свободного времени заставляет искать готовый ответ в виде по-возможности полного "справочника" какие надо переводить а какие нет. Заранее спасибо за ответ. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Artos 99 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 Zander_driver Думаю нет и не будет потребного для тебя 'справочника' (по многим причинам). Критерием тут является то, что если клиентский объект оперирует и изменяет эксклюзивную информацию, которая критична и должна быть сообщена серверу - то такие объекты без предварительной синхронизации ссервером (считай перевод в оффлайн) - удалять нельзя. И раз уж нет такого единого 'справочника', то исходить следует от обратного: потребовалась работа с конкретным типом объектов - именно для этого типа выяснить все нюансы и из запомнить. И т.д. по каждому типу. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Lagos 688 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 (изменено) Заспавнил торговца через смарт терраин. Получил вылет. Что не так вот здесь: squad_descr.ltx [darkscape_stalker]:online_offline_group faction = stalker sympathy = 1 npc = otshel target_smart = darkscape_stalker_smart spawn_point = zat_stalker_base_smart_spawn_barmen story_id = darkscape_stalker darkscape_stalker_smart.ltx [smart_terrain];darkscape_stalker_smart max_population = 1 [exclusive] ;darksape_stalker = darkscape\otshel_logic.ltx otshel_logic.ltx [logic@darksape_stalker] suitable = {=check_npc_name(otshel)} true trade = misc\trade\trade_otshel.ltx prior = 200 active = animpoint@bar_les can_select_weapon = false level_spot = trader [animpoint@bar_les] cover_name = zat_a2_sc_barmen avail_animations = animpoint_stay_table_no_rnd use_camp = false meet = meet combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = true gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false simulation.ltx ;;;;;;;;;;;;;;;;;;;;;;;; darkscape ;;;;;;;;;;;;;;;;;;;;;;;;;;;; [start_position_darkscape] darkscape_stalker = darkscape_stalker_smart Секция спавна [124] ; cse_abstract properties section_name = smart_terrain name = darksape_stalker_smart position = 250.339569091797,-0.22316600382328,-195.362701416016 direction = 0.106533996760845,-1.49463295936584,0.104124002158642 ; cse_alife_object properties game_vertex_id = 0 distance = 9.80000019073486 level_vertex_id = 58518 object_flags = 0xffffff3e custom_data = <<END [smart_terrain] cfg = scripts\darkscape\smart\darksape_stalker_smart.ltx END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 20 ; cse_alife_space_restrictor properties restrictor_type = 3 ; se_smart_terrain properties Помогите. Бьюсь со смартами уже вторую неделю.... Направте на правильный путь. Вот лог вылета: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...e.r. - Cia I?eiyoe\gamedata\scripts\sim_board.script:226: attempt to index local 'spawn_smart' (a nil value) Заранее спасибо. А верcию и патч игры - нам всем Пушкин подскажет? --/ Artos Изменено 27 Сентября 2011 пользователем Artos Официальный сайт . Ссылка на комментарий
_Призрак_ 11 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 (изменено) zoidberg123456789, у тебя почему то нет смарта darkscape_stalker_smart. Проверь запаковал ли ты спавн, без ошибок запаковался ли спавн, не забыл ли ты его потом переименовать из all.spawn.new в all.spawn Указывай, плз, адресата в своем ответе. --/ Artos Изменено 27 Сентября 2011 пользователем Artos Freedom Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти