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/
Dennis_Chikin 3 665 Опубликовано 10 Марта 2014 Поделиться Опубликовано 10 Марта 2014 Ну, например, в этих самых схемах могут вызываться функции, которые дохлякам не поддерживаются. Далее, это просто бесцельная трата ресурсов. Самое поганое, что я не могу понять, откуда оно лезет, и при каких условиях. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-827666
mumie 2 Опубликовано 13 Марта 2014 Поделиться Опубликовано 13 Марта 2014 (изменено) Сразу извинюсь, за немного глупый вопрос. Проблема в том, что бы забить все id объектов инвентаря в таблицу и на всякий пожарный еще и их состояние, создал две идентичные таблички и на одной и той же итерации, добавляю по объекту и его состоянию параллельно в обе таблички соответственно, но когда пытаюсь проверить и вывести, состояние у всех объектов равно 1, не смотря на то, что там есть изодранный в хламину сталкерский костюм, еле живой шлем и побитый автомат... --Вот функция загрузки таблиц local tItems={} local tCond={} function Actor_Has_ListItems() local cnt = db.actor:object_count() for i=0, cnt-1 do local item = db.actor:object(i) local sobj = alife():object(item:id()) if sobj then table.insert(tItems,item) table.insert(tCond,item:condition()) end end end --Этой я проверяю состояние function test_t(n) text="His condition -"..tCond[n] news_manager.send_tip(db.actor,text , nil, nil, 30000) end n-параметр, который вводится с помощью горячих клавиш, На numpad'e(1-9).То есть, могу вывести состояние 9 различных объектов их таблицы(теоретически). где я допустил ошибку? Заранее спасибо) Изменено 13 Марта 2014 пользователем mumie Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-828295
Nazgool 251 Опубликовано 13 Марта 2014 Поделиться Опубликовано 13 Марта 2014 mumie Возьми в инвентарь только 4 сломанных предмета и проверь на numpad'e все 9 вариантов. Штук 5 должны быть равны 1 (детектор, фонарь, бинокль, пда, нож), остальные меньше 1. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-828355
mumie 2 Опубликовано 13 Марта 2014 Поделиться Опубликовано 13 Марта 2014 (изменено) ,нет, все так как и сказал. У всех предметов, кондишн по единице. Изменено 13 Марта 2014 пользователем mumie Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-828379
Den-Stash 14 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 Подскажите пожалуйста, можно ли умножить вектор на матрицу без танцев с бубном (В Lua_Help не нашел - приходится юзать промежуточную матрицу) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-828996
Graff46 623 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 Доброго времени суток! Подскажите есть ли в классе CUIStatic метод поворота текстуры, (я искал не нашёл) платформа ТЧ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829011
Nazgool 251 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 (изменено) Graff46 Прямого метода нет. Поворот возможен только при использовании *.xml файлов. Но способ скриптово управлять всем тем, что пока управляется только из *.xml существует. P.S. По крайней мере я это делаю. Только на вопрос КАК? пока не отвечу, т.к. расширение для этого ещё не дописал. Лень. Изменено 16 Марта 2014 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829053
Graff46 623 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 Graff46 Поворот возможен только при использовании *.xml файлов. Мне метод когда статики выводят через *.xml не подходит, они под родной худ уходят и удаляются ф-цией level.hide_indicators() Я делаю статики методом таким local hud = CUIStatic()hud:Init(0,0,1024,768) hud:InitTexture("my\\krepost\\glass") hud:Show(true) hud:SetStretchTexture(true) get_hud():AddDialogToRender(hud) При таком подходе статики не пропадают при диалогах, открытом инвентаре, пда и так далее. Я хотел таким способом миникарту сделать, а для этого нужно вращать текстуру. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829117
Nazgool 251 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 Вращать не выйдет Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829178
Graff46 623 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 Вращать не выйдет Понятно. Жаль. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829179
7.9 174 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 (изменено) ... есть ли в классе CUIStatic метод поворота текстуры... платформа ТЧ. CUIStatic : CUIWindow { CUIStatic (); ... void SetHeading(float angle); ...} http://www.amk-team.ru/forum/index.php?showtopic=7450&page=7#entry515301 Изменено 16 Марта 2014 пользователем 7.9 всё легко Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829253
Nazgool 251 Опубликовано 16 Марта 2014 Поделиться Опубликовано 16 Марта 2014 (изменено) Поворот возможен только при использовании *.xml файлов ) Если в xml не прописать heading=1 (а xml не устраивает)... Мне метод когда статики выводят через *.xml не подходит ..то повторю, - Вращать не выйдет Изменено 16 Марта 2014 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829288
kmsk 2 Опубликовано 18 Марта 2014 Поделиться Опубликовано 18 Марта 2014 Ребят помогите ... есть такая функция которая при взятии оружия меняет на актерское оружие... но проблева в том как передать аддоны и количество жизней оружию)))зарание спасибо если кто знает как это сделать))) function wpn_update() local wpn_actor = {"wpn_pm","wpn_pb","wpn_fort","wpn_apb","wpn_hpsa","wpn_beretta","wpn_walther","wpn_colt1911","wpn_ups","wpn_desert_eagle","wpn_desert_eagle_full","wpn_sig220","wpn_pp19","wpn_mp5","wpn_ak74u","wpn_ak74","wpn_abakan","wpn_l85","wpn_lr300","wpn_sig550","wpn_sig_m1","wpn_sig_m2","wpn_g36","wpn_fn2000","wpn_vintorez","wpn_val","wpn_val_m1","wpn_groza","wpn_svd","wpn_svu","wpn_bm16","wpn_bm-16_full","wpn_toz34_short","wpn_toz34","wpn_wincheaster1300","wpn_spas12",}for _, section in pairs (wpn_actor) dolocal wpnObject = db.actor:object(section)if wpnObject thendb.actor:drop_item(wpnObject)alife():release(alife():object(wpnObject:id()), true)spawn.inv(section.."_actor)endendend Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-829899
mumie 2 Опубликовано 20 Марта 2014 Поделиться Опубликовано 20 Марта 2014 @kmsk,Состояние очень легко wpnObject:condition() -- это сохраняешь в переменную скажем cond wpnObject:set_condition(cond)-- это когда будешь спавнить свой ствол, просто дописываешь после спавна @kmsk,небольшой апдейт.проверить наличие аддонов можно так(не знаю прокатит ли, но в ЛУА_хелпе иного нет совсем ) weapon_scope_status() weapon_grenadelauncher_status() weapon_silincer_status() --Данная группа функций должна возвращать наличие или отсутствие аддонов на стволе. weapon_is_silencer() weapon_is_scope() weapon_is_grenadelauncher() -эта группа должна выводить тип, если есть. Могу ошибаться, лучше проверить. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830707
kmsk 2 Опубликовано 20 Марта 2014 Поделиться Опубликовано 20 Марта 2014 (изменено) mumie, Я сделал но почему-то ошибка, 10 раз все перепроверил не могу понять причины: Expression : fatal error Function : CScriptEngine::lua_errorFile : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cppLine : 73Description : <no expression>Arguments : LUA error: ...hadow of chernobyl\gamedata\scripts\wpn_actor.script:99: attempt to index local 'wpn' (a nil value) Пишет что wpn нет равно нулю for _, section in pairs (wpn_actor) dolocal wpnObject = db.actor:object(section)if wpnObject thenlocal cond = wpnObject:condition()db.actor:drop_item(wpnObject)alife():release(alife():object(wpnObject:id()), true)local spawnwpn = section.."_actor"local obj = alife():create(spawnwpn,vector():set(0,0,0),1,1,db.actor:id())local wpn = db.actor:object(spawnwpn)wpn:set_condition(cond)endend З.Ы. если ставлю проверку local wpn = db.actor:object(spawnwpn)if wpn thenwpn:set_condition(cond)end передачи жизней нет Изменено 20 Марта 2014 пользователем kmsk Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830760
*Shoker* 322 Опубликовано 20 Марта 2014 Поделиться Опубликовано 20 Марта 2014 (изменено) @kmsk, Потому что сразу после создания ствола нельзя получить его клиентский объект - его ещё не существует. Переносить аддоны и состояние можно через нет-пакеты, я завтра попробую откопать то что нужно. Если бы ещё нужный скрипт ещё был бы под рукой, но некоторые здесь поспособствовали, и теперь его придётся искать у себя или брать первый попавшийся. Изменено 20 Марта 2014 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830765
mumie 2 Опубликовано 21 Марта 2014 Поделиться Опубликовано 21 Марта 2014 @kmsk, да, прости. Я думал ты уже разобрался с мутками клиентских объектов и работу с ними.@*Shoker*,Слушай, а не подскажешь как можно функционально прикрутить/снять к/у стволу/а аддоны? а то вот как раз не смог найти такой функции. Вывод, либо ее нет, либо не там искал, конечно же... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830788
Zander_driver 10 348 Опубликовано 21 Марта 2014 Поделиться Опубликовано 21 Марта 2014 как можно функционально прикрутить/снять к/у стволу/а аддоны? Берем нет-пакет ствола, уводим его в оффлайн, меняем в нет-пакете что нам надо (например наличие/отсутствие аддонов), присваиваем новый нет-пакет стволу, выводим его в онлайн. вроде так. Вопрос по работе с оконными классами, точнее с текстурами для них. прежде чем устанавливать текстуру для статика методом void InitTexture(string texture); можно ли как то проверить что данная текстура (string texture) существует? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830875
Charsi 441 Опубликовано 21 Марта 2014 Поделиться Опубликовано 21 Марта 2014 Если texture это файл, то его наличие можно проверить так getFS():exist("$game_textures$", texture..".dds") Если это идентификатор текстуры, то нужно проверить его наличие в файлах-описателях для текстур. Их имена перечислены в секции texture_desc. Если не нашлось ни того ни другого, ругаемся в лог и текстурим окно какой-нибудь заведомо существующей дефолтной текстурой. 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-830909
proper70 75 Опубликовано 23 Марта 2014 Поделиться Опубликовано 23 Марта 2014 (изменено) Наконец-то победил причину автозавершения квестов на защиту барьера и им подобным после сейв/лоада) Найдена и вырвана с корнем глубоко сидевшая в скриптах ошибка еще от ПЫСов, что в сейве не сохранялся ИД смарта, от которого надо защищать другой смарт) Этот ИД задавался при выдаче таска, но при сейв/лоаде он терялся, и после лоада это ИД было = nil. Но ее легко было бы выловить, если бы при запросе состояния несуществующего гулага возвращалось заведомо несуществующее значение, например -1. Но xr_gulag.getGulagState() при несуществующем гулаге возвращает 0, или состояние неактивного, пустого гулага. Вот проверка и срабатывала, что гулаг зачищен, и задание выполнялось)) Это, конечно, досадная оплошность со стороны того, кто делал скрипты гулагов, и, если бы не она, то это все было бы выявлено и поправлено еще в далеком 2007 году) а так эта проблема дожила аж до 2014 года)) И, наконец, она вылечена)) Правка этой ошибки в общем случае требует НИ, так как в нетпакет пишется новое значение и меняется его размер. Но можно использовать технологию двухэтапного подключения этой и подобных ей правок, без начала НИ. Для этого нужно в методе save выдать поршень, и в методе load его проверять при чтении нетпакета. Тогда на старых сейвах до правки будет читаться старый нетпакет, а на новых - новый) Вот правка автозавершения на task_manager от Народной Солянки на версии 1.0006: -- Будем записывать не id задания а его хеш - семикратная экономия. function CRandomTask:save(p) printf("^^^ SAVE") -- Отметка того, что это новая версия формата. p:w_u8(255) --' Считаем количество записей local i = 0 for k,v in pairs(self.task_info) do i = i + 1 end p:w_u8(i) for k,v in pairs(self.task_info) do if not id_to_hash[k] then abort("Cannot find hash for id %s!",k) end p:w_u16(id_to_hash[k]) p:w_bool(v.enabled) p:w_bool(v.enabled_props) if not status_to_num[v.status] then abort("Wrong status '%s' for task %s!",v.status,k) end p:w_u8(status_to_num[v.status]) p:w_u32(v.selected_target or -1) p:w_u32(v.defend_target or -1) -- Фикс автозавершения квестов utils.w_CTime(p, v.last_task_time) end --' Та же самая процедура с активными тасками i = 0 for k,v in pairs(self.active_task_by_type) do i = i + 1 end p:w_u8(i) for k,v in pairs(self.active_task_by_type) do if not ct_to_hash[k] then abort("Cannot find hash for complex type %s!",k) end p:w_u16(ct_to_hash[k]) if not id_to_hash[v] then abort("Cannot find hash for task id %s!",v) end p:w_u16(id_to_hash[v]) end -- Фикс автозавершения квестов db.actor:give_info_portion("fix_task_manager") end --' Загрузка function CRandomTask:load(p) printf("^^^ LOAD") --' Считаем количество записей local rt0=p:r_tell() local i = p:r_u8() amk.mylog("tasks "..i) if i~=255 then for k = 1,i do local id = p:r_stringZ() if id ~= nil and self.task_info[id] ~= nil then self.task_info[id].enabled = p:r_bool() self.task_info[id].enabled_props = p:r_bool() self.task_info[id].status = p:r_stringZ() local selected_target = p:r_u32() if selected_target ~= -1 then self.task_info[id].selected_target = selected_target end -- Фикс автозавершения квестов if has_alife_info("fix_task_manager") then local defend_target = p:r_u32() if defend_target ~= -1 then self.task_info[id].defend_target = defend_target end end self.task_info[id].last_task_time = utils.r_CTime(p) end end --' Та же самая процедура с активными тасками local i = p:r_u8() amk.mylog("active "..i) for k = 1,i do local id = p:r_stringZ() self.active_task_by_type[id] = p:r_stringZ() end else i=p:r_u8() for k = 1,i do local hash = p:r_u16() local id=hash_to_id[hash] if not id then abort("Cannot find id for hash %d!",hash) end self.task_info[id].enabled = p:r_bool() self.task_info[id].enabled_props = p:r_bool() self.task_info[id].status = num_to_status[p:r_u8()] local selected_target = p:r_u32() if selected_target ~= -1 then self.task_info[id].selected_target = selected_target end -- Фикс автозавершения квестов if has_alife_info("fix_task_manager") then local defend_target = p:r_u32() if defend_target ~= -1 then self.task_info[id].defend_target = defend_target end end self.task_info[id].last_task_time = utils.r_CTime(p) end --' Та же самая процедура с активными тасками i = p:r_u8() amk.mylog("active "..i) for k = 1,i do local cthash = p:r_u16() local id=hash_to_ct[cthash] if not id then abort("Cannot find complex type for hash %d!",cthash) end local hash=p:r_u16() self.active_task_by_type[id] = hash_to_id[hash] if not self.active_task_by_type[id] then abort("Cannot find task id for hash %d!",hash) end end amk.mylog("Feel the difference.") end amk.mylog("size "..p:r_tell()-rt0) end Если адаптация к старым сейвам не нужна, то можно выкинуть поршень fix_task_manager и все его проверки. Изменено 23 Марта 2014 пользователем proper70 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/275/#findComment-831126
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти