Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Shredder 49 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, рискну предположить что в конфигах монстров пропала такая строчка: script_binding = bind_monster.bind И версию игры укажи Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751548
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 Shredder, ТЧ 1.0004+АМК 1.4.1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751554
riddik121 193 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 Подскажите пожалуйста в чём причина. Использую обычный скрипт на передачу предмета function anarhist_pkm_done(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "wpn_pkm", "out") end скрипт проходит действие продолжается, но предмет остаётся у меня в инвентаре. Как это исправить? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751557
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751572
riddik121 193 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, а можешь по подробнее описать куда вставить твой скрипт и как потом будет выглядеть непосредственный скрипт передачи конкретного предмета (и денег). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751575
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 riddik121 Стандартный скрипт "dialogs.script". В нем ищешь эту функцию и заменяешь на мою. Shredder, конфиги монстров не редактировались. Причина в другом. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751583
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751596
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751652
ColR_iT 171 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 riddik121, это зависит от того, кто говорит фразу, в которой вызвана функция. Вообще первым аргументом передаётся говорящий, вторым - оппонент. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751658
Artos 99 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 (изменено) Похоже тема превращается из "Школы ...", в обменник: "это не знаю, но это плохо, а вот это мое вроде как лучше"... :-( Если задан вопрос, то нужно давать ответ по существу, а не тупо предлагать нечто, что может и позволит обойти ошибку, но не отвечает на вопрос и не учит в подобных ситуациях не наступать на грабли! riddik121, при вызовах функций из диалогов важна фаза диалога, а точнее кто же ее произносит. Ту или иную фразу может произносить как актор, так и его собеседние (НПС), и таким образом аргументы на входе функции (first_speaker, second_speaker) могут иметь порялок: актор,НПС или наоборот НПС,актор. В твоем случае, если фразу произносит актор (first_speaker), то и не будет ничего у него "забираться", т.к. у тебя забирается у second_speaker'а. Т.о. потрудись либо отслеживать фазы диалога и использовать аргументы по назначению, или же определяй внутри твоей функции "ху из ху" и применяй... Изменено 6 Января 2013 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751692
proger_Dencheek 6 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 ColR_iT, моя функция не требует объявления first_speaker, second_speaker. По этому она точно пригодится тому, кто задал вопрос, ведь у него с этими аргументами проблемы. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751718
ColR_iT 171 Опубликовано 6 Января 2013 Поделиться Опубликовано 6 Января 2013 proger_Dencheek, а когда это родная функция требовала "объявления first_speaker, second_speaker"? И у просившего проблемы как раз не с аргументами, а с определением того, на кокой реплике вызывать функцию, либо кого именно передавать в неё. P.S. Постарайся в следующий раз давать конкретный ответ на вопрос, а не распространять копи-паст. На этом оффтоп окончен. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-751733
proper70 75 Опубликовано 10 Января 2013 Поделиться Опубликовано 10 Января 2013 (изменено) Господа! Может не в тему, но вот я иногда заглядываю в эту тему и просто восторгаюсь терпению Артоса и иже с ним. Можно я скажу тем кто не может разобраться со спикерами, передачей предметов и прочими я бы сказал, очевидными вещами: вы просто скачайте последнюю солянку а лучше оп1, перенесите в отдельную папку папку config и scripts, поставьте себе notepad++ и используйте поиск фразы по файлам. И смотрите, как ваши пожелания сделаны у пысов или в солянке. Проблемы со спикерами? Поиск по файлам фразы first_speaker ответит на все ваши вопросы. Просто скопируйте уже рабочий код и поправьте на свои значения. Не перекладывается предмет из гг к неписю или в нычку - поиск по фразе transfer_item решит ее. А если не знаете с чего начать поиск - вспомните, где в игре есть подобное, найдите этот код по любой фразе, по диалогу например, или по описанию и дальше по цепочке поиском по ключевым словам. А если вы хотите научиться азам ООП на сталкере, просто ковыряя файлы - то у вас ничего не выйдет - вы начали с конца. Настоятельно рекомендую купить книгу основы ООП или похожую и внимательно изучить ее. Без этих знаний вы простоянно будете блудить в очевидных вещах, так ничему и не научитесь, и только зафлуживаете тему. Чтобы научиться читать - нужно как минимум выучить алфавит. Чтобы научиться считать - нужно как минимум выучить цифры. Чтобы научиться программировать в сталкере - нужно как минимум понять что такое объект, класс, наследование и чем конфиги отличаются от скриптов, а также чем серверный объект отличается от клиентского. Иначе у вас ничего не выйдет и для вас только один вариант - тупое копирование уже рабочих скриптов. Я не хочу хвастаться, но я 99% всех своих проблем решил простым поиском по скриптам и конфигам. Конечно, я знаком с основами ООП и это очень сильно мне помогало в пониманиии скриптов. Это поможет и вам) Изменено 10 Января 2013 пользователем proper70 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752529
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752925
7.9 174 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) ИМХО Если есть возможность и желание, конечно надо переписать. И по возможности, не только усовершенствовать, но и расширить. "+" И не только "sound_theme" - другие менеджеры и схемы то-же, есть куда и для чего совершенствовать и расширять. Изменено 12 Января 2013 пользователем 7.9 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752951
Shredder 49 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 (изменено) Другие тоже можно, но далеко не все. Скажем, все классы, унаследованные от object_binder нет возможности переписать. И что ты имеешь ввиду под "расширить"? Изменено 12 Января 2013 пользователем Shredder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752954
Malandrinus 615 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Прежде чем переписывать, неплохо было бы выяснить соотношение времени полезной нагрузки и вызова функции/метода. Т.е. в сравнении выше сравниваются накладные расходы на вызов соответственно метода класса и просто функции. Но я подозреваю, что фризы вовсе не связаны с расходами на вызов методов класса, а скорее всего это звуки так долго грузятся. При этом, могу предположить, что на фоне времени загрузки звуков расходы на вызов что метода, что обычной функции - это копейки. Так что рекомендую сначала это проверить, а потом уже что-то переписывать. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752962
7.9 174 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Много писать не буду... Если про "sound_theme" - то тут (с ходу) требуется расширение общего скриптового управления звуками... Ну там: "Менеджер торговли" - точно, явно нуждается в расширении и модернизации функционала... Ну и ещё там.... расширение каждого менеджера (схемы) лучше обсуждать одельно и подробно, так-сказать: "анализировать, фильтровать... и прочая"... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752963
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752968
abramcumner 1 229 Опубликовано 12 Января 2013 Поделиться Опубликовано 12 Января 2013 Но такой подход увеличил быстродействие только в 2 раза, что тоже не плохо, но не достаточно. Фризы то хоть уменьшились? при отказе от классов протестируй еще такой вариант: for i = 1, 1000000 do local n = b.num end Без функций вообще все летать будет. :ny_megalol: Ты кстати, проверил, что фризы из-за скриптов, если из-за скриптов, то именно из-за net_spawn? А то я недавно читал, что у кого-то фризы из-за моделей были. И при выходе в онлайн не только net_spawn вызывается. Время выполнения инициализации звуков я так понимаю ты замерил? Напиши цифирки, сколько функция выполняется и сколько весь net_spawn. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/244/#findComment-752981
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти