Artos 99 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) Struck 1. но текстов ограниченное количество, а кликов неограниченное количество, и еще нужно сделать запоминание одного текста для кажлого лист итема...- напрашивается однозначное ограничение - текстов в исходной таблице должно быть НЕ менее чем итемов -> тогда для каждого итема по первому по нему клику будет сопоставлен и запомнен(! должно быть!) и далее кликай сколько хочешь, т.к. будут выдаваться уже запомненные сопоставленные с итемами тексты. Т.о. условие "и он всегда должен выпадать когда я нажимаю на" удовлетворяется. 2. Напрашивается очевидное: при первом клике по итему из исходной таблицы изымается рандомный текст и помещается в поле второй (рабочей) таблице по ключу итема ( Tabl[item] = text_X ). При последующих кликах предварительно проверяется наличие ключа/поля в рабочей таблице и, если нет - то выбор для нового итема нового рандомного текста из исходной таблицы (с удаелнием из нее и запоминанием в рабочей). 3. Не очень понятна фраза: ... и еще нужно сделать запоминание одного текста для кажлого лист итема... - если подразумевается что это некий второй сопоставленный с итемом текст, обязательный для показа, то ... маловато условий. Это типа заголовок/нотация, т.е. заведомо сопоставленный текст, или текст тоже как-т рандомно иль иначе выдается или еще что ... В любом случае поле рабечей таблицы с ключом-итемом может быть составным и содержать пару сопоставленных итему текстов. Или же сделать третью табличку для "заголовков/описаний" итемов ... Тут уже фантазия и вусы. ;-) Вот вроде в кратце и весь алгоритм (один из ...) - теперь воплощай в коды. ;-) Изменено 7 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
kratos888 0 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) Всем доброго времени суток. На днях я столкнулся с проблемой считывания параметров NPC из XML-файла. Мне нужно считать параметр <bio>Краткая_биография</bio>. Полазил в интернете, посмотрел различные шаблоны XML-парсинга на LUA, и функцию string.gfind. Так вот, шаблон для захвата я вроде бы составил (не уверен, что правильно): function get_bio(npc) local xml_npc_bio = string.gfind(" ", "(%w%p_)(*_bio)") return xml_npc_bio end Хочу преобразовать исходное название шаблона "название_биографии_bio" в текст. Нужно для детальной информации... То, что я отметил под смайликом - это место, где нужно начать поиск необходимого шаблона. Вот только где нужно начать поиск шаблона? Пробовал через npc:name(), через npc:id()..., но выскакивает ошибка, типа "нет функции". Если кто разбирается в этом, помогите кто-нибудь, пожалуйста! Мне почему-то казалось, что этот тег, не что иное, как рудимент. ColR_iT Изменено 7 Июня 2012 пользователем ColR_iT Ссылка на комментарий
_Призрак_ 11 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 Получить значение поля bio не представляется возможным через функции. Можно конечно написать движковую функцию для того чтобы получать биографию, но врядли ты это осилишь. Поэтому придется парсить весь файл. Есть отличный парсер xml от Kirag, который отлично распарсивает весь файл в табличку, откуда я вынимал значения поля bio. Поищи на этом форуме Freedom Ссылка на комментарий
SkyLoader 53 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) Кто-нибудь использовал для неписей или монстров функцию action()? Рабочая ли она? В ЧН она использовалась, но финальном ТЧ вроде нет. Ты про какую конкретно функцию говоришь? Функция action есть в файле _g.scritp, есть метод класса planner_action, унаследованного от класса action_planner; есть в классах game_object и object. ColR_iT Добавлено через 53 мин.: Пример: action(trader, anim("vstuplenie"), cond(cond.anim_end)) Эта функция из файла _g.script. ColR_iT Изменено 7 Июня 2012 пользователем ColR_iT Ссылка на комментарий
_Призрак_ 11 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 SkyLoader Да, вполне, но не для всех. Например для ворон не работает Freedom Ссылка на комментарий
panzyuza 43 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) Прошу помочь разобраться с вопросом.Имеем данный код if db.actor~=nil then db.actor:set_character_rank(db.actor:character_rank()+math.random(10,20)) db.actor:change_character_reputation(db.actor:character_reputation()+math.random(88,99)) relation_registry.change_community_goodwill("dolg",db.actor:id(),tonumber(5000)) end Таким образом добавляем актору очки ранга рандомно, прибавляем репутацию и устанавливаем отношение группировки Долг к актору нетрально.В случае если враги.Правильно ли я растолковал данные части кода? Изменено 7 Июня 2012 пользователем panzyuza AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) panzyuza, нет, в твоем коде та же ошибка что и в оригинальной игре, т.е. наступаешь на грабли, которые кочуют из мода в мод. Функция change_character_reputation принимает аргументом число НА которое требуется изменить (change) ранг НПС, а не которое требуется установить. Т.о. строка должна выглядеть так: db.actor:change_character_reputation( math.random(88,99) ) - тогда имеющийся ранг актора (db.actor:character_reputation()) и будет изменен (увеличен/уменьшен) на задаваемое значение (88...99). В твоем же случае, как и в оригинальной игре, к уже имеющемуся рангу будет добавлен такой же плюс твоя добавка -> и постепенно будет превышено максимальное значение для ранга и "ранг уйдет в минус". Если же требуется установить фиксированное значение ранга - используй функцию установки, а не изменения: set_character_reputation(number) То же самое касается и community_goodwill, т.е.: - change_community_goodwill - изменяет на задаваемую дельту уже имеющееся текущее значение группировки к актору/НПС; - set_community_goodwill - устанавливает заданное значение, отбрасывая прежнее. Изменено 7 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 43 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) Artos, понятно.Спс.Просто был такой случай.Нужно было актору установить отношение к бандитам нейтрал(+2000).Но когда сработала функция set_community_goodwill ничего не произошло.Напротив change сработал. Изменено 7 Июня 2012 пользователем panzyuza AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 7 Июня 2012 Поделиться Опубликовано 7 Июня 2012 (изменено) panzyuza Я дал информацию по теории, чтобы ты исправил практические ошибки. ;-) На практике функции set_ действительно имеют некие коллизии в той или иной ситуации и вероятно это (переход от set к change без учета нюанса) и привело к ошибке в исходной игре. Конечно, если требуется просто задать абсолютное значение рангу или отношениям проще использовать set, но и применяя правильно change - получаем тот же результат. Из моей практики: Установка отношения для конкретного непися ( oNPC:set_community_goodwill(iGoodwill, oTargetNPC) ) - вполне корректно работает. А вот с группиповками похуже ... Тут для себя делаю так: Получаем текущее значение отношения: iGoodwill = relation_registry.community_goodwill(sFaction, oActor:id()) далее вычисляем требуемое, с учетом НЕпереполнения(!): iChkGoodwill = math.min(3000, math.max(0, iGoodwill +200)) ну и уже изменяем именно относительно текущего: relation_registry.set_community_goodwill (sFaction, oActor:id(), iChkGoodwill) - т.о. ставим именно сколько нам нужно, а не относительно имеющегося, которое может быть неприемлемым ... Несколько кучеряво - но надежно. Изменено 7 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ColR_iT 171 Опубликовано 8 Июня 2012 Поделиться Опубликовано 8 Июня 2012 Кто подскажет, что это за метод такой чудный - play_no_feedback, у класса sound_object, что при его использовании метод playing, этого же класса, всегда возвращает false, хотя я отчётливо слышу в наушник, как звук проигрывается? И вообще для чего у него аж пять аргументов? В принципе, первый, второй и пятый более менее понятны, а вот остальные для чего? Ну и вдогонку по классу sound_object... Совсем непонятны свойство frequency и метод stop_deffered. У кого какие мысли на счёт них? Ссылка на комментарий
Artos 99 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 ColR_iT, какое-либо действие можно запустить на выполнение с или без обратной связи, т.е. с отслеживанием состояние действия или по принципу "дал команду выполнить и забыл". При наличии обратной связи можно узнать, например относительно звука, играет ли звук, сколько времени еще осталось играть и т.п. ... Без обратной связи, отдав команду для проигрывания звука, ты не озаботился о последствиях и естественно в любом случае не можешь уже узнать играет звук или нет, т.е. попытка узнать это "всегда возвращает false". 3-ий аргумент - время задержки перед проигрыванием, т.е. начальная пауза. 4-ый аргумент - позиция относительно об'екта (1-ый аргумент), по которой будет проигрываться звук. т.е. звук не будет отслеживать об'ект, следуя за ним, а будет привязан к конкретной точке. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ColR_iT 171 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 Artos, не очень понял твои слова об "обратной связи". Вот код: if hud:GetCustomStatic("main_task") then --# Определим объект и что будем играть local snd_obj = xr_sound.get_safe_sound_object([[detectors\bomb_timer]]) --# Затычка запуска один раз if varible == 0 then --# Играем звук snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1) --# "Затыкаем" varible = varible + 1 end get_console():execute("load ~~~ Playing is "..tostring(snd_obj:playing())) end Висит на апдейте актора. Зажимаю Tab - в консоле только false. Если для проигрывания использую метод play: snd_obj:play(db.actor, 0, sound_object.s2d) То пока звук играет выводит true. Так задумано? Ссылка на комментарий
Artos 99 Опубликовано 9 Июня 2012 Поделиться Опубликовано 9 Июня 2012 (изменено) ColR_iT, обратная связь - это как раз то, что запущенное событие способно тебе предоставлять информацтю о своем состоянии и ты можешь проверять играет ли и т.п. Если ты запускаешь проигрывание звука методами play или play_at_pos - тем самым ты запускаешь с обратной связью и можешь "общаться" с запущенным процессом, проверяя playing, останавливать - stop и т.п. Запуск методом play_no_feedback - НЕ дает обратной связи, т.е. ты просто дал команду "проиграть звук" и все, далее процесс автономен и не общается с тобою, т.е. не реагирует на твои запросы (нет обратной связи). Т.о. сделав запрос такому процессу: "Ты играешь?" - ты всегда будешь получать в ответ false, т.е. процесс тебя просто не слушает и не отвечает на твой запрос. Изменено 9 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 10 Июня 2012 Поделиться Опубликовано 10 Июня 2012 (изменено) как запомнить какой текст выпал и больше его не выдаватьДля твоих целей как нельзя лучше подходит совершенно замечательный код, написанный Рики Лэйком (Rici Lake, rici@ricilake.net) Изменено 10 Июня 2012 пользователем Gun12 Ссылка на комментарий
_Призрак_ 11 Опубликовано 14 Июня 2012 Поделиться Опубликовано 14 Июня 2012 Проконсультируйте по такому вопросу: У меня в моде получается очень много рестрикторов, который срабатывают один раз, а потом лежат мертвых грузом. Хотел бы узнать, как правильно удалить спейс_рестриктор чтобы не получить после удаления осложнений. Спейсы не прописаны в in/out рестрикторах у НПС. Подойдет ли здесь простое получение серверного объекта и его удаление через alife():release()? Freedom Ссылка на комментарий
ColR_iT 171 Опубликовано 14 Июня 2012 Поделиться Опубликовано 14 Июня 2012 (изменено) _Призрак_, а чем плох метод перевода схемы рестриктора в nil? Их апдейты при этом не работают, схемы - подавно, висят себе в сохранениях... Изменено 14 Июня 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 15 Июня 2012 Поделиться Опубликовано 15 Июня 2012 (изменено) Не согдашусь с ColR_iT'ом, 'мусор" и рудименты в малых количествах может и хлопотнее подчищать чем не замечать, но ... и море состоит из капелек, так что и захлебнуться можно. Ну а серьезно, если рестриктор не прописывается куда/кому-либо, а обычный, то мало можно найти причин беспокоиться о его удалении. Если уж аномалии прямо "на ходу" удаляются - то уж с рестрикторами все гораздо проще. _Призрак_, советую задуматься над довольно простым, но действенным вариантом зачистки отрабоотавщих рестрикторов: 1. Предпосылки: - а зачем вообще спавнить все рестрикторы из алл.спавна в начале игры(?), и даже те, которые нужны то в самом конце на самых последних минутах и всего-то для простой мелочевки? - в зачем оставлять по всей Зоне, хотя и невидимые, но никомму не нужные и по сути рудиментарные уже об'екты? Ответ довольно прост, потому что засунув все в конфиги алл.спавна, на фоне всей кучи этого и не заметно, а в игре игрок и не подозревает. Для скриптового спавна же требуется немного заморочиться и с конфигами и с нет-пакетами (шейпами) ... В результате - как в столовой, берем на поднос весь ассортимент обеда и с него едим, хорошо хоть первое со вторыи и с компотом не замешано вместе, а по разным тарелкам/стаканам ... ;-) Т.о. в моде, если у модмейкера голова на плечах и руки не из места "пониже" ... то и спавнить разовые рестрикторы можно по мере надобности, запоминая их хоть по ид-ам иль инаяе, и удалять когда отпала нужда. Вспомним разные телепорты и временные левел-ченджеры. Наверное самое разумное: появляется ГГ на новом уровне первый раз - нужные рестрикторы спавнятся на локацию. Уходит с нее - отработавшие удаляются. Вернулся (если по сюжету) - другой набор рестрикторов ... и т.д. и т.п. Момент перехода актора на др.уровень ловить несложно, и по этому моменту принимать решение, так что даже с запасом время есть. 2. То, что отработавшие рестрикторы не сильно заняты в апдейтах - в общем да, но не забываем, что все они спавнятся (а это время), всем онлайновым инициализируется логика, для всех все одно вызывается и метод апдейта, проверяющий не отрабоотавший ли(?), т.е. в табличке ли апдейтящихся ... Также, биндер в табличку апдейтов заносит по мере спавна (а значит при загрузке игры в net_spawn), а удаляет - по net_destroy, и, т.к. рестрикторы в оффлайн не уходят и на дистанцию алайфа чихают, то ... пока не выйдешь из игры/с локации - отключенные рестрикторы апдейтятся "по полной программе" (ну или около того). Все это конечно вроде как мизер (для каждого в отдельности иль кучкой), но ... все это суммируясь отжирает русурсы. Так зачем же их терять с самого начала игры и копить баласт на протяжении всего похода по Зоне? Сами модмейкеры игроку и переносимый вес обрезают, и патрон/аптечек лишают, и здоровье при первом удобном случае норовят попортить ... а вот за "собою"подчищать и освобождать игру от "переносимого веса-баласта" - это как раз и как-то не принято. :-( 3. Ну про занятые и не освобождающие ID можно не поминать в суе ... но если, например, десятка два локаций и на каждой по сотне две отработанных рестрикторо - 20х200 = 4.000 - это уже более 6% (от 65535), что не так уж и мало только на баластные рестрикторы! На большом и развивающемся моде это может быть началом проблем. Так что _Призрак_, уверен что рестриктор отработал - чисть его при первом удобном случае, но не превращай в погоню за "чистотою", так что затратишь не менее чем вычистишь. ;-) P.S. В принципе, даже проверял и где-то применяю - в самой логике рестриктора по окончании активной секции переключая на 'nil' - вызываю функцию удаления "самого себя". Т.к. удаляется серверный об'ект а в потоке работает гейм-об'ект, удаление происходит чисто и удобно, т.е. без лишних телодвижений и затрат. Изменено 15 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
SibireaStalker 0 Опубликовано 16 Июня 2012 Поделиться Опубликовано 16 Июня 2012 Доброго времени суток. Камрад пытался реализовать, чтобы производился звук при одевании комбинезона. На тестах получили следущее: звук производится постоянно, вне зависимости от того, надевается предмет, стоит в слоте или вовсе в рюкзаке. Делали так: function proverka_na_helmet() local actor = db.actor local slot_twelve = db.actor:item_in_slot(12) if actor and slot_twelve == 0 then actor:disable_info_portion("info_to_twelve_mod") return end if actor and slot_twelve ~= 0 and actor:disable_info_portion("info_to_twelve_mod") then local snd = sound_object([[interface\mp_reward]]) -- Путь до звука snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) actor:disable_info_portion("info_to_twelve_mod") end end Не подскажете что не так? Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
Vano_Santuri 33 Опубликовано 16 Июня 2012 Поделиться Опубликовано 16 Июня 2012 (изменено) SibireaStalker, Попробуй так, сам не проверял, да и алгоритм не сильно экономичный. local flag_s = false -- изначално звук запрещен. function proverka_na_helmet() local actor = db.actor local slot_twelve = db.actor:item_in_slot(12) if actor then -- есть актор if slot_twelve == 0 then -- слот пуст => flag_s = true -- разрешаем звук end end if flag_s then -- разрешен звук if actor then -- есть актор if slot_twelve then -- есть костюм local snd = sound_object([[interface\mp_reward]]) -- Путь до звука snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) -- даем звук flag_s = false -- запрещаем звук. end end end end Второй вариант, обрезал лишние апдейты. local flag_s = false -- изначално звук запрещен. function proverka_na_helmet() local actor = db.actor local slot_twelve = db.actor:item_in_slot(12) if not flag_s then -- работает только если звук запрещен... if actor then -- есть актор if slot_twelve == 0 then -- слот пуст => flag_s = true -- разрешаем звук end end end if flag_s then -- разрешен звук if actor then -- есть актор if slot_twelve then -- есть костюм local snd = sound_object([[interface\mp_reward]]) -- Путь до звука snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) -- даем звук flag_s = false -- запрещаем звук. end end end end Эти варианты - не панацея, можно сделать куда короче, но нужно подумать... Изменено 16 Июня 2012 пользователем Vano_Santuri Что-то кончается, что-то начинается... Ссылка на комментарий
Капрал Хикс 537 Опубликовано 16 Июня 2012 Поделиться Опубликовано 16 Июня 2012 SibireaStalker, стоп-стоп... Разве в оригинале НЕТ звука надевания костюма? о_О Что мешает изменить сам звук, если уж он не устраивает? 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти