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/
vampirnik77 121 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 И такой еще вопрос, как можно сделать, что бы функция отрабатывалась в следующем апдейте, тоесть вызов происходит в апдейте 1, а отрабатываеться функция в апдейте 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959131
dsh 3 824 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 @vampirnik77, самое первое решение, приходящее в голову: на первом апдейте поставить флажок и ничего не делать, а на втором апдейте проверить флажок, сделать что надо и сбросить его. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959136
Dennis_Chikin 3 664 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 local myfunc_call = 1 function myfunc() if myfunc_call == 1 then myfunc_call = 2; return end myfunc_call = 1 ... end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959137
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 (изменено) -- Вызывает вункцию func спустя n апдейтов function wait_call(func, n) local counter = n or 1 level.add_call( function() if counter == 0 then return true end counter = counter - 1 return false end, func ) end Изменено 22 Августа 2015 пользователем Shredder 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959153
Zander_driver 10 348 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Конечно можно, берёшь исходники и вперёд. Иначе никак Вообще-то есть другой вполне рабочий вариант. Он даже уже выложен, правда без инструкций. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959176
RayTwitty 561 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 -- Вызывает вункцию func спустя n апдейтовХех, я практически тоже самое делал себе)) function _G.parked_call(action, ...) local args = {...} local x = 2 level.add_call( function() x = x - 1 return x == 0 end, function() loadstring("return function(args) "..action.."(unpack(args)) end")()(args) end ) end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959181
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Вообще-то есть другой вполне рабочий вариант. Он даже уже выложен, правда без инструкций. А может не будем голословны? Исходники передо мной и там не предусмотрено добавление пунктов из скриптов или конфигов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959183
Zander_driver 10 348 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 А может не будем слепы? Мои скрипты тоже передо мной и я при желании добавляю какие угодно пункты к списку команд. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959198
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 А толку то с твоих постов? Даже если и есть возможность, ты же этот способ не показал. Поэтому пока ты голословен Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959202
Zander_driver 10 348 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 (изменено) Ах вот как, ну окей. Показать видео - не считается за "показать". Выложить код, пусть сырой - не считается за "показать" Надо выложить код не сырой а готовый, со всеми пояснениями Ладно, это я пока не сделал. Значит голословен. Изменено 22 Августа 2015 пользователем Zander_driver Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959205
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 (изменено) Ни видео, ни сырой код я не видел Изменено 22 Августа 2015 пользователем Shredder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959208
Zander_driver 10 348 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Ну вот поэтому я вас и называю слепым Код в прозекторской, видео... попробуйте сами догадаться где. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959210
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Так бы и написал, что полностью скриптовый инвентарь. Ссылки то сразу дать религия не позволяет? Для меня этот вариант вообще не вариант. Не доверяю я программистам, которые пишут в один файл овер 30000 строк кода. А возвращаясь к исходному вопросу: "... можно ли добавить в это меню свой пункт?", брать исходники и добавлять, иначе никак Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959226
Zander_driver 10 348 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Ссылки то сразу дать религия не позволяет? Ссылка на тему разработки у меня в подписи. ссылку на сырой код? не вижу в нем большой ценности Когда к файлу будут инструкции, число строк в нем перестанет смущать а пока да. Все остается так же. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959229
antihumanist 0 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 (изменено) Немогу понять почему не работает скрипт.По задумки при сбросе рюкзака он должен заполнятся инвентарем актора, делаю для теста что-бы понять как это все потом сделать в другом моде. файл bind_stalker.script function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update() local time = time_global() game_stats.update (delta, self.object) --*************************************************** -->>Treasure rucksack 1/2--- вот рабочий код сбрасываемого рюкзака, брал из википедии сталкера, этот код работает поэтому полностью его не привожу if self.rr_id~=nil then--то что мы записали при дропе -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) --obj_ruck = ruck--это типа переменной для теста с таймером --Start_Timer_5_minutes()--подумал что может не успевает отработать, но с таймером та-же байда my_mod.push_all(ruck) --вот та функция которая ЗДЕСЬ не работает, но работает в другом месте, не пойму что не так end -- сбросим переменную self.rr_id=nil end --Timer_N_minutes()--пробовал типа по таймеру вызывать, все так-же не работает --<< --*************************************************** -- апдейт погоды дальше все стандартно ... Если сделать так, то рюкзак сбрасывается но походу после my_mod.push_all(ruck) ничего не работает :-( игра не вылетает но повторно скрипт уже не срабатывает как нужно, с таймером пробовал но все так-же.Код таймера не привожу так как там по сути все то-же самое только вызывается с задержкой. Из my_mod.script Функция заимствована из скрипта арены там где телепортирует актера на арену а все вещи складываются в ящик. local function transfer_object_item(item) db.actor:transfer_item(item, in_object) end function push_all(obj) in_object = obj db.actor:inventory_for_each(transfer_object_item) end Эту функцию я тестировал с модовым рюкзаком вызывая ее из калбека когда перс забирает предмет(ы) из ящика и там она работает function actor_binder:take_item_from_box(box, item)-- --my_mod.push_all(obj)--вот так она работает, при перемещении чего либо из ящика срабатывает калбак, инвентарь актора перемещается в ящик, то что мы оттуда забрали перемещается в инвентарь так как и должно по коду игры. --my_mod.Message("take_item_from_box")--типа сообщение для информирования Изменено 23 Августа 2015 пользователем antihumanist Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959448
Charsi 441 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 @antihumanist, у тебя ruck это серверный объект, а в transfer_item нужно передавать клиентский. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959451
antihumanist 0 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 antihumanist, у тебя ruck это серверный объект, а в transfer_item нужно передавать клиентский. Хм а получить его как ? в справочнике из очевидного не нашел Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959454
Shredder 49 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 level.object_by_id(ruck.id), но вызвать нужно будет на следующем апдейте, т.к. в этом онлайновый объект ещё не появится Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959458
Dennis_Chikin 3 664 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 Точнее - проверять, пока не появился. Закладываться на фиксированное время - плохо. Дабы не тормозило - см. про управление апдейтами (тысячи их !) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959459
antihumanist 0 Опубликовано 23 Августа 2015 Поделиться Опубликовано 23 Августа 2015 (изменено) Точнее - проверять, пока не появился Ура работает ! спасибо ! --*********************************************************************** --Код тестовый и по хорошему его нужно переделать, но для теста пойдет и так local iTimer --переменная времени для таймера(никто не мешает использовать ее как простой флаг) local obj_ruck-- серверный обдж рюкзака, тут думаю лучше передавать сразу ид, но для теста сойдет function Start_Timer_5_minutes() iTimer = --[[time_global() +]] 300 --тут закоментирован код таймера, просто устанавлевается флаг end function Timer_N_minutes() -- таймер переделанный в функцию проверки на существование, в апдейте if iTimer ~= nil --[[and iTimer < time_global()]] then local c_ruck = level.object_by_id(obj_ruck.id)--поидее если объект не нашелся то его нет(работает) if c_ruck then my_mod.push_all(c_ruck) iTimer = nil--убираем флаг или обнуляем таймер end end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update() local time = time_global() game_stats.update (delta, self.object) --*************************************************** -->>Treasure rucksack 1/2 if self.rr_id~=nil then--то что мы записали при дропе -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) obj_ruck = ruck--передаем в переменную Start_Timer_5_minutes()--ставим флаг или таймер --my_mod.push_all(level.object_by_id(ruck.id))--тут работать не будет end -- сбросим переменную self.rr_id=nil end Timer_N_minutes()--выполняем таймер/функцию апдейта состояния рюкзака --<< --*************************************************** -- апдейт погоды Тогда еще пара вопросов уж простите.Делаю фан мод и сборку из чужих скриптов для этого мода и поэтому вопросы совершенно разные. Сделал ремонтные наборы, но столкнулся со странным багом, не совсем понимаю его природу. суть его в том что когда я вызываю подряд две функции на съедание одного и того-же предмета то последняя функция не выполняется и дает глюки, точно так-же с вызовом удаления предмета. Все обернуто в функцию которая вызывается из колбека self.object:set_callback(callback.use_object, self.repair_start, self) function actor_binder:repair_start(obj, who) my_mod.Message("use_object") if obj then main_sleep.sleep(obj) if obj:section() == "repair_kit_outfit" then --здесь указываем предмет, при использовании которого будет срабатывать функция ниже exp_mod.action_repair() --тут функции которые не учавствуют в тесте и уже тестироваись elseif obj:section() == "repair_kit" then exp_mod.repair_all() elseif obj:section() == "repair_kit_wpn" then exp_mod.repair_wpn() --второй вариант ремонта elseif obj:section() == "repair_kit_device" then--вот отсюда вызываю exp_mod.repair_device() elseif obj:section() == "repair_kit_wpn2" then exp_mod.repair_wpn2() elseif obj:section() == "repair_kit_outfit2" then exp_mod.repair_outfit2() end end end --Короче говоря в моде есть три "съедобных" итема ящик с инструментами и ремкомплекты один для брони и другой для оружия, когда игрок пытается съесть ящик с инструментами то выполняется эта функция, которая по задумке должна ремонтировать все во всех слотах при этом съедая/удаляя из инвентаря расходники ремкомплектов. но оставляя инструменты.Не работает когда я пытаюсь вызвать подряд две функции съедания/удаления одного вида предмета.Ремкомплекты так-же обрабатываются при употреблении в пищу, с расчетом одна еденица ремкомплекта на одну еденицу брони/оружия в слоте.С оружием работают последовательно что сделанно для удобства ремонта чего-то одного а не всего сразу. --repair_item_in_slot(num) -- это моя функция ремонта, переделанная, с википедии сталкера, к ней нет нареканий --Она проверяет слот num и возвращает true если предмет был отремонтирован, если в слоте пусто или предмет не того состояния которого требуется для ремонта или еще что не так то возвращает false, так-же информирует игрока. function repair_device()--ящик с инструментами repair_kit_device, функция в которой должно ремонтироваться все что в слотах(сразу) local actor = db.actor local kit_outfit2 = actor:object("repair_kit_outfit2")--ремкомплект для костюма alife():create("repair_kit_device", vector(),0,0,0)--cпавним сразу как съели, хотя работало и если поместить в конец. if kit_outfit2 then--проверяем наличие расходника для ремонта в инвентаре актора --db.actor:eat(db.actor:object("repair_kit_outfit2")) --можно его сразу тупо съесть if repair_item_in_slot(6) then --тогда этот код здесь не нужен, он запустися в биндере при "поедании" "repair_kit_outfit2" alife():release(alife():object(kit_outfit2:id()), true)--и этот код будет то-же не нужен end-- end--конец ремонта костюма local kit_wpn2 = actor:object("repair_kit_wpn2")--ремкомплект для оружия, поидее тут я хочу отремонтировать сразу все стволы, т.е. два слота 1 и 2 поэтому делаю два раза одно и то-же. if kit_wpn2 then --db.actor:eat(db.actor:object("repair_kit_wpn2"))можно место удаления съедать, но у меня так не работало для двух одинаковых предметов сразу и я решил переделать if repair_item_in_slot(2) then alife():release(alife():object(kit_wpn2:id()), true) end end --Если раскомментировать код ниже, то он работать не будет ! но почему ? --kit_wpn2 = actor:object("repair_kit_wpn2")--Здесь еще раз инициализируется на случай если объект съеден/удален кодом выше --if kit_wpn2 then ----db.actor:eat(db.actor:object("repair_kit_wpn2"))--либо код жрачки либо код удаления --if repair_item_in_slot(1) then--при юзе кода жрачки не требуется --alife():release(alife():object(kit_wpn2:id()), true) --end --end end Изменено 24 Августа 2015 пользователем Kirgudu Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/328/#findComment-959500
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти