panzyuza 41 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) Artos, а если в моей функции заместо передачи параметра story_id просто написать npc:id(), не будет ли это чревато последствиями? Не путай игровые ID со 'story_id' иль другими. Это совершенно разные вещи. Чревато тем, что в данном конкретном случае ты и не пропишешь в конфиг динамически(!) выдаваемый объекту идентификатор и он (ID) обрабатывается именно как 'story_id' (level_object_by_sid). Т.е. придется менять метод. P.S. Поправлюсь, если использовать именно входной аргумент 'npc' - то в принципе подобное возможно. Тогда и не зачем вводить и определять cNpc, а только (пере)проверить наличие этого объекта (НПС) в игре. (плз, более информативно задавай вопрос, т.к. 'куцая' информация на некий прежде заданный вопрос порой приводит к 'не вникнул в тему') --/ Artos Добавлено через 102 мин.: А перепроверить наличие можно такой функцией? if npc ~= nil and npc:alive() then 1. Это не функция, а условие проверки внутри функции; 2. В принципе можно и так, хотя 'npc:alive()' - излишне, логика для 'уже' трупов все одно не обрабатывается. Если хочешь 'наверняка', то можно например так: if npc and level.object_by_id( npc:id() ) then --/ гейм-объект в игре? не забудь и порядок аргументов анимации и звука поправить, если убираешь 1-ый аргумент (story_id) --/ Artos Изменено 3 Сентября 2011 пользователем Artos AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) panzyuza, ColR_iT, Tris Вновь о 'known_info' и выдаче инфопоршня при обыске трупа: 1. Как уже ранее писал, этот параметр обрабатывается при спавне объекта (NPC) и сразу же(!) при наличии в нем информации о инфопорiне - этот инфопоршень выдается данному конкретному NPC. Актору(ГГ) этот инфопоршень недоступен. 2. При смерти NPC (обыскать можно только труп) на практике проверено - при обыске трупа актору (ГГ) выдаются все выданные для обыскиваемого NPC инфопоршни. Т.к. процесс такой передачи отсутствует в кодах игры - следует предположить, что данный функционал (передаче всех известных/выданных инфопоршней от НПС актору) прописан в движке. Т.о. используя параметр 'known_info' в конфигах логики НПС или же просто выдавая в процессе игры (в момент 'net_spawn'а) требуемый инфопоршень конкретному НПС можно передавать этот инфопоршень актору в момент обыска трупа этого НПС. ИМХО, подобное свойство передачи инфопоршня можно использовать далеко не только из логики (требует еще перепроверки нюансов). Простор для идей немаленький. :-) (еще раз приношу извинения за ранее некорректные выводы основанные на кодах игры без учета функционала движка). Изменено 4 Сентября 2011 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Desertir 202 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 Как можно узнать класс возвращаемого функцией объекта? Допустим функция get_console() вернет объект класса CConsole, но как узнать что именно CConsole, а не какой нибудь еще? ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
RvP 1 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Desertir, именно тут сравнить, а в произвольном случае - никак рефлексия из этого луабинда выпилена полностью Изменено 4 Сентября 2011 пользователем RvP Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий
singapur22 14 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Desertir, По сути, как уже было сказано RvP, никак. Но... Смотря где и зачем тебе это нужно. Классы всегда можно переопределить (унаследовать), и назначить им дополнительные методы и(или) свойства. Унаследовать можно конечно не все классы, но многие (условий наследования несколько). Есть ещё одно незначительное условие, названия переопределяемых классов придётся поменять, что потребует их переименование во всей скриптовой системе. Изменено 4 Сентября 2011 пользователем singapur22 Опаа-а!!! Ливер вылез! Ссылка на комментарий
Painter 3 410 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Доброго времени суток. Подскажите, что нужно сделать, чтобы при приближении мутантом (или иного врага) к неписю, диалог между ним и ГГ автоматически прерывался? Подойдёт ли такой способ? [meet] close_anim = nil close_snd_hello = nil close_snd_bye = nil trade_enable = false snd_on_use = nil use = [b]{=check_enemy_name(sim_default) =fighting_dist_ge(20)} false[/b] Задавая вопрос - уточняйте версию игры, если имеются различия для ТЧ/ЧН/ЗП! Прерывание схемы 'meet' происходит автоматически при срабатывании 'combat_ignore' (если не отключено), где и можно задавать дистанции. Условие же для 'use' и не закроет окно диалога, а не даст его открыть. И необходимо прописывать так, чтобы в любом случае он возвращало 'true' или 'false', т.е. типа: use = {=check_enemy_name(sim_default) =fighting_dist_ge(20)} false, true --/ Artos Изменено 4 Сентября 2011 пользователем ColR_iT Портфолио Ссылка на комментарий
*Shoker* 322 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Напомните, какой функцией можно переместить предмет в определённый слот, зарание спасибо. Задавая вопрос, стОит озаботиться тем. чтобы его поняли. И тем более для подобных вопросов следует уточнять версию игры (ТЧ/ЧН/ЗП). Каждый предмет приписан некоторому слоту и перемещать в 'определенный' (кем?) слот - ну ни как не получится. Т.е. какому слоту прописан и если он свободен - в тот слот и попадет предмет при его взятии (ТЧ/ЧН). --/Artos Добавлено через 41 мин.: > Каждый предмет приписан некоторому слоту и перемещать в 'определенный' (кем?) слот - ну ни как не получится. В ЗП появились равнозначные слоты (1-2), суть в том, что если поднять предмет, он перемещается во 2 слот оружия, ежели второй слот оружия занят, он не занимает первый слот, хотя должен. Для этого я хочу скриптово поместить оружие в 1 слот. Но вот функцию найти не могу Тест был на автоматах, возможно пистолеты он таки поместит в 1 слот. Ну и в догонку, никто не знает способ определения наличия гранаты в подствольном гранатомёте? Я заменяю оружие путём его удаления\спауна нового, но при этом граната пропадает... С патронами проблем нету, а что делать с гранатой? Метод unload_magazine() выставляет патроны в 0 (чёртовы GSC), надо глянуть как он обращается с гранатой, но подозреваю что также. Изменено 4 Сентября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) *Shoker* Вот и нужно было уточнять версию игры, если имеются некие отличия. Хотя в ЗП и появились равнозначные слоты (а это всего лишь 1 и 2), но сути для оружия не меняет. То, что ручками можно переложить ствол из одного оружейного слота в другой, иль даже в любой версии, некоторые предметы или в слот или на пояс (который тоже слот) - не меняет сути. Предмету прописан конкретный ОДИН слот и именно в него этот предмет может автоматически при 'взятии' помещаться, если 'прописанный' слот свободен. В другой 'разрешенный' слот автоматически предмет не попадет. Сорри, но функции именно 'ручного' помещения предмета в конкретный слот мне неизвестны. Судя по 'напомните' в твоем вопросе - тебе они были известны? Может вспомнишь и просвятишь нас?;-) Для работы с подствольными зарядами тебе придется работать с нет-пакетами ... Хотя их наличие можно проверить тем же 'get_ammo_in_magazine()', но при условии установленного режима использования именно подствольника. Изменено 4 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Может вспомнишь и просвятишь нас? ;-)Просто в ЗП при старте игры автоматически предметы кладутся в слоты быстрого юзанья. Я щас нашёл, оказалось это консольная команда и тока для них (slot_1, slot_2 ...) Для работы с подствольными зарядами тебе придется работать с нет-пакетамиНе просвятишь где именно смотреть, в какой cse_ ? но при условии установленного режима использования именно подствольника.Не вариант. Изменено 4 Сентября 2011 пользователем ColR_iT Пользуемся тегами! Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) *Shoker* Ну ... при необходимости и достаточности - и консольную команду можно вызывать скриптом. :-) Посмотреть работу с подствольниками и зарядами в них можно, например, в модулях расширеной арены (m_aem.script -> CArenaExt:UnLoad_Shells()) и в менеджере оружия (m_wpn_mgr.script) из Simbion-мода. Не помню, есть ли в исходных оригинальных модах. Примечание: Учитывая, что пакеты для разных классов оружия довольно схожи - возможно и портирование кусков (иль целиком) пакетов от старого к новому объекту ... без их детального разбора. Но конечно же это уже идет конкретика и коды писать под определенные условия. А может быть соберусь и напишу универсльные варианты определения режимов оружия и секция зарядов в подствольниках (аналогично патронам), но пока не вижу насущной необходимости. Изменено 4 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
@"StreloK" 2 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Спавню НПС с такой логикой - custom_data = <<END [spawner] cond = {+info_portion_swanp_kvest_adept_1_start} [smart_terrains] none = true [logic] on_death = death active = camper [death] on_info = %+info_portion_swanp_kvest_adept_1_kill_sniper% [camper] path_walk = swamp_sniper_merk_walk_1 path_look = swamp_sniper_merk_look_1 sniper = true END Может кто подсказать проверку на день\ночь? Нужно чтоб он появлялся только ночью, а днём уходил в оффлайн. B штатном 'xr_conditions.script' имеется 'is_day(actor, npc)', но не уверен, что для [spawner] подойдет ... Обычно это делается в состояниях для гулаговыйх работ, кои у тебя невозможны (гулаги отключены). --/ Artos Artos, спасибо, попробую. Делать гулаг там бессмысленно ради одноразового ночного снайпера просто. Добавлено через 30 мин.: Artos, проверка прекрасно работает и снайпер появляется вечером как часы, спасибо. И ещё вопросик - может кто подсказать как сделать, чтобы при обыске трупа ГГ выдавался инфопоршень? А поднять глаза чуть выше (пост #2643) - что мешает? --/ Artos Сообщение от модератора ColR_iT Ребята, ну правда, прочитывайте хотябы страниц пять предыдущих постов! Изменено 4 Сентября 2011 пользователем ColR_iT Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
Tris 9 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Вопрос по логике (ЗП) Что нужно прописать чтобы сталкер был главным в отряде? Командир отряда НЕ назначается, им автоматически становится первый, что был 'принят' в отряд (при спавне). Пока командир не погибнет или не будет исключен из отряда - никакой демократии! --/ Artos Изменено 4 Сентября 2011 пользователем Artos • Dead Forgetting Zone • Мои работы. Обновление: 24.08.2012 Ссылка на комментарий
*Shoker* 322 Опубликовано 4 Сентября 2011 Поделиться Опубликовано 4 Сентября 2011 (изменено) Использую эту функция как замену str_explode (я думаю многие её уже видели, т.к она тут обсуждалась какое то время назад) function str_expl(sStr, Mode, sDiv, sPattern) local tRet = {} local sPatt if sDiv and not sPattern then --// если сепаратор задан: разделяем по нему --// если нет шаблона - используем универсальный sPatt = '[^%s%'..sDiv..']+' --// если сепаратор указан как nil, но указан шаблон: используем его elseif not sDiv and sPattern then sPatt=sPattern else--/ если сепаратор и шаблон не указаны: разделяем слова sPatt = '[%w%_]+' end if Mode == nil then --// обычный массив for sValue in sStr:gmatch(sPatt) do table.insert(tRet, sValue) end elseif Mode == true then --// таблица '[значение]=true' for sValue in sStr:gmatch(sPatt) do tRet[sValue] = true end elseif type(Mode) == "number" then --//таблица '[idx] = число или стринг' for sValue in sStr:gmatch(sPatt) do tRet[#tRet+1] = tonumber(sValue) or sValue end end return tRet end Суть в чём, есть текст вида X|Какое то название При таком вызове - str_expl("X|Какое то название", nil, "|", nil), я ожидаю нарезки по | , что и делает старый вариант от АМК, возвращая две строки. Новый вариант разрезает ещё и по пробелам (по крайнем мере мне возвращается вторым аргументом тока первое слово до пробела.) Вопрос: Т.к я не указываю sPattern, я понял что разраезается по этому шаблону: sPatt = '[^%s%'..sDiv..']+' Ну так вот, как мне переделать шаблон, чтобы он по умолчанию учитывал и обрезал только по тому элементу, что я ему дал (в данном случае "|") Я думаю достаточно (?) просто оставить sPatt = sDiv ? Но пишу я не только из за этого, а просто хочу спросить, можно ли улучшить эту функцию, чтобы обрезала только первый пробел (при условии что он есть) Тоесть допустим если я передам "X| Какое то название", где есть пробел после |, он вернёт "XI" и "Какое то название" а не "XI" и "_Какое то название", то есть вернёт 2 строку без учёта первого пробела(ов) после разделителя I Под _ я подразумеваю пробел. Извиняюсь, что пост вышел несколько некрасивым. Очень важно наличие универсальной функции, вариант писать шаблон под каждый str_explode не подходит. (да и не особо я понимаю как их составлять) Изменено 4 Сентября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) *Shoker* Без проблем, мог бы и сам подсмотреть в известном тебе моде. ;-) Заменяем патерн для сепаратора на такой: sPatt = '%s*([^'..sDiv..']+)' --/ исключая начальные пробелы Но зачем оставлять и заключительный пробел (если таковой будет)? Более уместно сделать и с его обрезанием: sPatt = '%s*([^'..sDiv..']+)%s*' --/ исключая начальные и заключительные пробелы - и получаем разделение строки именно по сепаратору, с отбрасываение начального и конечного пробелов, но сохраняя их внутри. Но я бы и саму функцию чуть подправил, т.к. условия несколько избыточны. В случае, если заданы и сепаратор и патерн - резаться строка будет ни по тому ни по другому, а по 'словам'. ИМХО, раз что-то задано - то это должно иметь приоритет над дефолтными установками. Заодно можно добавить контроль заданных стрингов для сепаратора и/или патерна (порой и это желательно). Итого получится такая функция: function str_expl(sStr, Mode, sDiv, sPattern) local tRet = {} local sPatt = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам') --/ если задан сепаратор: разделяем по сепаратору if type(sDiv) == "string" then sPatt = '%s*([^'..sDiv..']+)%s*' --/ по разделителю (исключая начальные и заключительные пробелы) --/ если указан шаблон: используем шаблон elseif type(sPattern) == "string" then sPatt = sPattern end if Mode == nil then --/ обычный массив for sValue in sStr:gmatch(sPatt) do table.insert(tRet, sValue) end elseif Mode == true then --/ таблица '[значение]=true' for sValue in sStr:gmatch(sPatt) do tRet[sValue] = true end elseif type(Mode) == "number" then --/ таблица '[idx] = число или стринг' for sValue in sStr:gmatch(sPatt) do tRet[#tRet+1] = tonumber(sValue) or sValue end end return tRet --/> возвращаем таблицу end Изменено 5 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 Спасибо за исправление Немного не в тему, но где можно почитать о том, как составлять шаблоны? В частности что это такое - ([^' и прочие комбинации. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Nazgool 250 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) В любом справочнике по luа. В сети их не так уж и мало. Правда сухие фразы определений это плохой помощник для новичка. Может прийдет вдохновение - напишу подробнее. Добавлено через 308 мин.: ИМХО, раз что-то задано - то это должно иметь приоритет над дефолтными установками. Заодно можно добавить контроль заданных стрингов для сепаратора и/или патерна (порой и это желательно). Если расставлять приоритеты (в принципе), то борясь за каждую миллисекунду всякими контролями можно пренебречь. И если я сам пишу код, то наверняка знаю что, куда и как писать. И зачем мне думать, что кто-то там полезет в него и накосячит. Я, например, могу пожертвовать этим ради скорости. Не знают - нечего лезть. Т.е. вот это : local sPatt = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам') --/ если задан сепаратор: разделяем по сепаратору if type(sDiv) == "string" then sPatt = '%s*([^'..sDiv..']+)%s*' --/ по разделителю (исключая начальные и заключительные пробелы) --/ если указан шаблон: используем шаблон elseif type(sPattern) == "string" then sPatt = sPattern end Я записал бы так (пусть, например, паттерн будет приоритетнее сепаратора): local sPatt = sPattern or sDiv and '%s*([^'..sDiv..']+)%s*' or '[%w%_]+' А если уж ставил бы проверки, то тотальные. Первой же строкой что-то типа : if not sStr then return '' end sDiv экранировать спец. символы (вдруг кто-то забыл, не знал) sPattern в локальной функции сделал бы проверку на корректность составления паттерна (то, что я до сих пор не внёс в script Syntax Checker) Изменено 5 Сентября 2011 пользователем Gun12 Ссылка на комментарий
Artos 99 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) Gun12 Все же в моем посте был приведен не вариант некоей универсальной функции, а правка той, о которой был задан вопрос. И одна из целей - сохранить прежнее начертание кода, уже привычное и понятное кому-то. Ты конечно прав насчет 'борьбы за лишние милисекунды', но(!) такая борьба возможна только при жестко заданных условиях. И, к сожалению, скорость и универсальность - обычно достигаются взаимоисключающими методами/способами. Мне в исходном варианте вообще непонятно наличие во входных аргументах и сепаратора и патерна. Ведь один в любом случае исключает другой - ну так и не требуются взаимоисключающие аргументы. Вместо аргумента патерна стОило бы задавать влаг 'чистки' пробелов, например. Тогда комбинацией параметров можно от функции получать больше вариаций ее использования. Нечто типа: function str_expl(sStr, sDiv, Mode, bNoClear) if not (sStr and sStr ~= '') then return {} --/> нечего разделять local tRet = {} local sPattern = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам') if type(sDiv) == "string" then --/ если задан сепаратор: разделяем по нему if bNoClear then --/ если НЕ указано 'чистить пробелы' sPattern = '([^'..sDiv..']+)' else --/ иначе с чисткой пробелов sPattern = '%s*([^'..sDiv..']+)%s*' end end --/ разделяем строку по патерну if Mode == nil then --/ обычный массив for sValue in sStr:gmatch(sPattern) do table.insert(tRet, sValue) end else local sTypeMode = type(Mode) if sTypeMode == "boolean" then --/ таблица '[значение] = true или false' for sValue in sStr:gmatch(sPattern) do tRet[sValue] = Mode end elseif sTypeMode == "number" then --/ таблица '[idx] = число или стринг' for sValue in sStr:gmatch(sPattern) do tRet[#tRet+1] = tonumber(sValue) or sValue end end end return tRet --/> возвращаем таблицу end - в >90% случаев потребуется всего лишь вызов типа str_expl( string, ',' ) - просто, ясно, быстро и надежно. :-) Изменено 5 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Gektor 0 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) Добрый вечер, меня интересует такой вопрос: Можно ли скриптовой функцией применить апгрейд на ствол? Если сие возможно, то какой функцией? Заранее спасибо. ТЧ, ЧН, ЗП? ColR_iT Изменено 5 Сентября 2011 пользователем ColR_iT Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу. Ссылка на комментарий
panzyuza 41 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 (изменено) А нету ли технологии, которая бы обьединяла сталкеров в симуляционные отряды с указанием приоритетных смарттерейнов?Скажем так, аналог системы симуляции ЗП, но под ТЧ? Просто через конфиги, смарты, рестрикторы и логику очень нужно много чего делать, что бы добиться подобного? Собственно это и будет технология. ColR_iT Я понимаю, что это и есть технология.Просто может в каком нибудь моде удалось реализовать подобное?Я вот по второй технологии делаю.Скриптово еще не скоро смогу осуществить задуманное. Что же тебя постоянно тянет на флуд и оффтопик? :-) Подобные вопросы следует адресовать в топиках типа "Ищу моды ы которых ..." иль "Идеи и их реализация" В данном топике (ИМХО) все же обсуждается конкретика, основанная на уже готовых наработках/кодах/классах. --/ Artos Изменено 5 Сентября 2011 пользователем Artos AVS_LOCATION_MOD Ссылка на комментарий
Nazgool 250 Опубликовано 5 Сентября 2011 Поделиться Опубликовано 5 Сентября 2011 Artos Да я вот тоже до сих пор ломаю голову, зачем нужно вот это : elseif type(Mode) == "number" then --//таблица '[idx] = число или стринг' for sValue in sStr:gmatch(sPatt) do tRet[#tRet+1] = tonumber(sValue) or sValue end end Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти