Shredder 49 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, рискну предположить что в конфигах монстров пропала такая строчка: script_binding = bind_monster.bind И версию игры укажи Ссылка на комментарий
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 Shredder, ТЧ 1.0004+АМК 1.4.1 Ссылка на комментарий
riddik121 193 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 Подскажите пожалуйста в чём причина. Использую обычный скрипт на передачу предмета function anarhist_pkm_done(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "wpn_pkm", "out") end скрипт проходит действие продолжается, но предмет остаётся у меня в инвентаре. Как это исправить? Надо дело довести до конца! Ссылка на комментарий
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 (изменено) riddik121, стандартная диалоговая функция немного капризная, лучше заменить ее на мою функцию: function relocate_item_section(victim, section, type, col) if col == nil then col = 1 end if db.actor ~= nil and section ~= nil then if type == "in" then for i=1,col do alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) if victim ~= nil then local inv = victim:object(section) if inv ~= nil then alife():release(alife():object(inv:id()), true) end end end elseif type == "out" then local inv = db.actor:object(section) if inv ~= nil then for i=1,col do if victim ~= nil then alife():create(section, victim:position(), victim:level_vertex_id(), victim:game_vertex_id(),victin:id()) end alife():release(alife():object(inv:id(),true) end end end news_manager.relocate_item(db.actor, type, section) end end Изменено 6 Января 2013 пользователем ColR_iT Ссылка на комментарий
riddik121 193 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, а можешь по подробнее описать куда вставить твой скрипт и как потом будет выглядеть непосредственный скрипт передачи конкретного предмета (и денег). Надо дело довести до конца! Ссылка на комментарий
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 riddik121 Стандартный скрипт "dialogs.script". В нем ищешь эту функцию и заменяешь на мою. Shredder, конфиги монстров не редактировались. Причина в другом. Ссылка на комментарий
ColR_iT 171 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, интересно, чем же твоя функция лучше? Парой дополнительных проверок и возможностью указывать количество предметов для передачи? Боюсь, что в данном случае "твоя" функция так же не поможет... riddik121, вероятнее всего ты не правильно передаешь в функцию "кто-есть-кто". Вызывая на реплике НПС, ты передаёшь предмет от актора к актору. Попробуй вызвать функцию так: function anarhist_pkm_done(first_speaker, second_speaker) dialogs.relocate_item_section(first_speaker, "wpn_pkm", "out") end Что касается функции по универсальнее, то позволь тебе предложить следующее: --# Функция трансфера предметов в указанном количестве. --# Избавился от необходимости вставлять квестовый предмет в таблицу quest_section. --# Теперь "квестовость" предмета определяется по наличию поля quest_item, со значением true, в секции предмета. --# victim - ['userdata'] от кого (type == "in") либо кому (type == "out") передавать предмет; --# section - ['string'] секция передаваемого предмета; --# type - ['string'] тип передачи ("in" - актору, "out" - от актора); --# count - ['number'] количество предметов для передачи (по умолчанию - 1); --# hide - ['boolean'] показывать ли факт передачи в виде сообщения в окне диалога (true - скрыть). function relocate_item_section (victim, section, type, count, hide) local actor = db.actor local ini = system_ini() --# Определим является ли передаваемый предмет квестовым. local item_is_quest = ini:section_exist(section) and ini:line_exist(section, "quest_item") and ini:r_bool(section, "quest_item") if actor and victim then --# Передвать нужно от НПС актору. if type == "in" then --# Если предмет квестовый, то ... if item_is_quest then --# Передадим предмет(ы). transfer_item_between_npc (victim, actor, section, count) --# Иначе просто заспавним в нужном количестве. else spawn_to_inventory (section, actor, count) end --# Передавать нужно от актора НПСу. elseif type == "out" then --# Передадим их НПС. transfer_item_between_npc (actor, victim, section, count) end --# Нужно ли явно сообщать о передачи в окне диалога? if not hide then news_manager.relocate_item(actor, type, section) end end end --# Функция спавна предметов в инвентарь. --# section - ['string'] секция предмета, который будем спавнить; --# whom - ['userdata'] кому будем спавнить (по умолчанию актору); --# count - ['number'] сколько будем спавнить (по умолчанию 1). --# Если каким-то образом section равен nil/false, либо предмет не является инвентарным, спавн происходить не будет. function spawn_to_inventory (section, whom, count) --# Проверим передана ли секция, и предмет инвентарный. if not section or not system_ini():line_exist(section, "inv_name") then return end --# Определим кому спавнить, если whom не равен 'userdata', то спавнить будем в инвентарь актора. local actor = type(whom) == "userdata" and whom or db.actor --# Спавним в указанном количестве, либо в одном экземпляре, если count не передан. for i=1, count or 1 do alife():create(section, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id()) end end --# Функция передачи предметов от одного НПС к другому в указанном количестве. --# who - ['userdata'] кто передаёт; --# whom - ['userdata'] кому передавать; --# section - ['string'] секция предмета; --# count - ['number'] количество предметов (если не указано, то 1). function transfer_item_between_npc (who, whom, section, count) --# Если нет от кого и кому передавать, то выйдем. if not who and not whom then return end --# Передадим указанное количество предметов, если не передан count, то передадим один предмет. for i = 1, count or 1 do who:transfer_item(who:object(section), whom) end end 3 Ссылка на комментарий
riddik121 193 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 я так понимаю first_speaker - первый говорящий (ГГ), second_speaker - второй говорящий (НПС). Т.е., к примеру function название функции(first_speaker, second_speaker) dialogs.relocate_item_section(first_speaker, "предмет на отдачу", "out") - передача предмета от ГГ к НПС dialogs.relocate_item_section(second_speaker, "получение предмета","in") - получение предмета от НПС к ГГ end Надо дело довести до конца! Ссылка на комментарий
ColR_iT 171 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 riddik121, это зависит от того, кто говорит фразу, в которой вызвана функция. Вообще первым аргументом передаётся говорящий, вторым - оппонент. Ссылка на комментарий
Artos 99 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 (изменено) Похоже тема превращается из "Школы ...", в обменник: "это не знаю, но это плохо, а вот это мое вроде как лучше"... :-( Если задан вопрос, то нужно давать ответ по существу, а не тупо предлагать нечто, что может и позволит обойти ошибку, но не отвечает на вопрос и не учит в подобных ситуациях не наступать на грабли! riddik121, при вызовах функций из диалогов важна фаза диалога, а точнее кто же ее произносит. Ту или иную фразу может произносить как актор, так и его собеседние (НПС), и таким образом аргументы на входе функции (first_speaker, second_speaker) могут иметь порялок: актор,НПС или наоборот НПС,актор. В твоем случае, если фразу произносит актор (first_speaker), то и не будет ничего у него "забираться", т.к. у тебя забирается у second_speaker'а. Т.о. потрудись либо отслеживать фазы диалога и использовать аргументы по назначению, или же определяй внутри твоей функции "ху из ху" и применяй... Изменено 6 Января 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 ColR_iT, моя функция не требует объявления first_speaker, second_speaker. По этому она точно пригодится тому, кто задал вопрос, ведь у него с этими аргументами проблемы. Ссылка на комментарий
ColR_iT 171 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, а когда это родная функция требовала "объявления first_speaker, second_speaker"? И у просившего проблемы как раз не с аргументами, а с определением того, на кокой реплике вызывать функцию, либо кого именно передавать в неё. P.S. Постарайся в следующий раз давать конкретный ответ на вопрос, а не распространять копи-паст. На этом оффтоп окончен. Ссылка на комментарий
proper70 74 Опубликовано 10 Января 2013 Поделиться Опубликовано 10 Января 2013 (изменено) Господа! Может не в тему, но вот я иногда заглядываю в эту тему и просто восторгаюсь терпению Артоса и иже с ним. Можно я скажу тем кто не может разобраться со спикерами, передачей предметов и прочими я бы сказал, очевидными вещами: вы просто скачайте последнюю солянку а лучше оп1, перенесите в отдельную папку папку config и scripts, поставьте себе notepad++ и используйте поиск фразы по файлам. И смотрите, как ваши пожелания сделаны у пысов или в солянке. Проблемы со спикерами? Поиск по файлам фразы first_speaker ответит на все ваши вопросы. Просто скопируйте уже рабочий код и поправьте на свои значения. Не перекладывается предмет из гг к неписю или в нычку - поиск по фразе transfer_item решит ее. А если не знаете с чего начать поиск - вспомните, где в игре есть подобное, найдите этот код по любой фразе, по диалогу например, или по описанию и дальше по цепочке поиском по ключевым словам. А если вы хотите научиться азам ООП на сталкере, просто ковыряя файлы - то у вас ничего не выйдет - вы начали с конца. Настоятельно рекомендую купить книгу основы ООП или похожую и внимательно изучить ее. Без этих знаний вы простоянно будете блудить в очевидных вещах, так ничему и не научитесь, и только зафлуживаете тему. Чтобы научиться читать - нужно как минимум выучить алфавит. Чтобы научиться считать - нужно как минимум выучить цифры. Чтобы научиться программировать в сталкере - нужно как минимум понять что такое объект, класс, наследование и чем конфиги отличаются от скриптов, а также чем серверный объект отличается от клиентского. Иначе у вас ничего не выйдет и для вас только один вариант - тупое копирование уже рабочих скриптов. Я не хочу хвастаться, но я 99% всех своих проблем решил простым поиском по скриптам и конфигам. Конечно, я знаком с основами ООП и это очень сильно мне помогало в пониманиии скриптов. Это поможет и вам) Изменено 10 Января 2013 пользователем proper70 2 Ссылка на комментарий
Shredder 49 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) В соседней теме "Ковыряемся в файлах (ЗП)" я спрашивал о тормозах при выходе НПС в онлайн. Одним из таких "тормозных" мест является вызов sound_theme.init_npc_sound(self.object) в net_spawn NPC. Стал разбираться, в чём дело. Оказывается в sound_theme при инициализации создаётся очень много объектов от классов npc_sound, actor_sound и т.д., при выполнении init_npc_sound НПС регестрируется в каждом объекте класса npc_sound. Как-то в одной из тем была информация о том, что методы объекта выполняются гораздо дольше, чем просто функции. Вспомнив об этом, решил ещё раз проверить этот факт: class "TestClass" function TestClass:__init() self.num = 100 end function TestClass:set(n) self.num = n end function TestClass:get() return self.num end function s_set(_self, n) _self.num = n end function s_get(_self) return _self.num end local npc_table = {} function on_inventory_open() local a = TestClass() local timer1 = profile_timer() timer1:start() for i = 1, 1000000 do a:set(i) end timer1:stop() _m.logf('##TestClass set is ' .. timer1:time()); local b = {num = 100} local timer2 = profile_timer() timer2:start() for i = 1, 1000000 do s_set(b, i) end timer2:stop() _m.logf('##not class set is ' .. timer2:time()); local timer3 = profile_timer() timer3:start() for i = 1, 1000000 do local n = a:get() end timer3:stop() _m.logf('##TestClass get is ' .. timer3:time()); local timer4 = profile_timer() timer4:start() for i = 1, 1000000 do local n = s_get( end timer4:stop() _m.logf('##not class get is ' .. timer4:time()); end ##TestClass set is 350336.25 ##not class set is 29087.216796875 ##TestClass get is 413329.09375 ##not class get is 21887.28515625 Т.е. в случае НЕ классов выигрыш в скорости составляет более чем в 10 раз. В связи с чем хочу переписать весь sound_theme, но прежде, чем приступить, хотелось бы услышать мнение других мододелов, может я что-то не учёл и "шкурка не стоит выделки" Изменено 12 Января 2013 пользователем Shredder 1 Ссылка на комментарий
7.9 174 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) ИМХО Если есть возможность и желание, конечно надо переписать. И по возможности, не только усовершенствовать, но и расширить. "+" И не только "sound_theme" - другие менеджеры и схемы то-же, есть куда и для чего совершенствовать и расширять. Изменено 12 Января 2013 пользователем 7.9 всё легко Ссылка на комментарий
Shredder 49 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) Другие тоже можно, но далеко не все. Скажем, все классы, унаследованные от object_binder нет возможности переписать. И что ты имеешь ввиду под "расширить"? Изменено 12 Января 2013 пользователем Shredder Ссылка на комментарий
Malandrinus 615 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Прежде чем переписывать, неплохо было бы выяснить соотношение времени полезной нагрузки и вызова функции/метода. Т.е. в сравнении выше сравниваются накладные расходы на вызов соответственно метода класса и просто функции. Но я подозреваю, что фризы вовсе не связаны с расходами на вызов методов класса, а скорее всего это звуки так долго грузятся. При этом, могу предположить, что на фоне времени загрузки звуков расходы на вызов что метода, что обычной функции - это копейки. Так что рекомендую сначала это проверить, а потом уже что-то переписывать. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
7.9 174 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Много писать не буду... Если про "sound_theme" - то тут (с ходу) требуется расширение общего скриптового управления звуками... Ну там: "Менеджер торговли" - точно, явно нуждается в расширении и модернизации функционала... Ну и ещё там.... расширение каждого менеджера (схемы) лучше обсуждать одельно и подробно, так-сказать: "анализировать, фильтровать... и прочая"... всё легко Ссылка на комментарий
Shredder 49 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) ... скорее всего это звуки так долго грузятся. Это первое на что я грешил, getFS():exist(), т.е. проверка на существование. Тогда я добавил кэширование в таблицу, т.е. проверка осуществлялась один раз, затем результат заносился в таблицу и для следующего НПС, выходящего в онлайн проверка не осуществлялась. Но такой подход увеличил быстродействие только в 2 раза, что тоже не плохо, но не достаточно. Да и если посмотреть на функцию: function init_npc_sound(npc) for k,v in pairs(theme) do if v.init_npc then --printf("checking %s for %s (%s)", v.section, npc:name(), character_community(npc)) if v.avail_communities[character_community(npc)] ~= nil then v:init_npc(npc) end end end end и учесть что в таблице theme более 600 объектов, я думаю уход от классов даст ещё больший прирост. 7.9, я так понимаю "расширение", это добавление нового функционала, но ведь его нужно добавлять по потребности. Допустим я в своём моде со звуками вообще никак не работаю, зачем мне расширять sound_theme? Изменено 12 Января 2013 пользователем Shredder Ссылка на комментарий
abramcumner 1 160 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Но такой подход увеличил быстродействие только в 2 раза, что тоже не плохо, но не достаточно. Фризы то хоть уменьшились? при отказе от классов протестируй еще такой вариант: for i = 1, 1000000 do local n = b.num end Без функций вообще все летать будет. :ny_megalol: Ты кстати, проверил, что фризы из-за скриптов, если из-за скриптов, то именно из-за net_spawn? А то я недавно читал, что у кого-то фризы из-за моделей были. И при выходе в онлайн не только net_spawn вызывается. Время выполнения инициализации звуков я так понимаю ты замерил? Напиши цифирки, сколько функция выполняется и сколько весь net_spawn. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти