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/
ColR_iT 171 Опубликовано 11 Февраля 2011 Поделиться Опубликовано 11 Февраля 2011 (изменено) Да-да! И меня тоже интересует вопрос antreg! Я уже задал подобный в теме "Ковыряемся в файлах", там мне сказали, что !возможно! они отслеживаються движково, для ограничения/разрешения. Лично по рестрикторам в кострах, абсолютно ничего не нашел. Единственное оправдание наличия "пустых" рестрикторов, я нашел на Wiki: >>Click Me<< Там, в условиях переключения схем от одной к другой есть такие строки: on_actor_in_zone = restrictor_name | scheme – если актер в зоне, (указывается имя рестриктора), т.е. выходит, что для такого случая логика для рестриктора не нужна!? А для костров, могу предположить, что они нужны, чтобы НПС не лезли в них, чего-то типа денжер зон. Удаление zone_flame_small удалит у тебя огонь как явление, т.е. партикл, а lights_hanging_lamp - свет вокруго него. По всей видимости взаимодействие между этими объектами происходит, непосредственно, при помощи движка. Изменено 11 Февраля 2011 пользователем Куфзук Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564019
SibireaStalker 0 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 Никто не подскажет, есть ли способ ускорить функцию demo_record, на больших локах тестить неудобно.... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564265
antreg 179 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 (изменено) Добрый день! Можно ли удалить скриптовой функцией спейс_рестриктор. Вот такой: [6565] ; cse_abstract properties section_name = space_restrictor name = camp_fire_0011 position = -4.02209758758545,3.58234667778015,200.165649414063 direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 2117 distance = 0 level_vertex_id = 73868 object_flags = 0xffffff3e ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 1.7837952375412,0,0 shape0:axis_y = 0,1.93420171737671,0 shape0:axis_z = 0,0,1.7837952375412 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 2 Если да, то как должна выглядеть функция в этом случае? Изменено 12 Февраля 2011 пользователем antreg Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564267
Scarabay 98 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 SibireaStalker, Никто не подскажет, есть ли способ ускорить функцию demo_record, на больших локах тестить неудобно.... shift - замедление ctrl - ускорение Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564276
Министр 4 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 antreg, как-то так: local obj = alife():object("camp_fire_0011") alife():release(obj, true) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564313
TRAMP14 1 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 Здравствуйте, надыбал скрипт который не берёт оружие без экзы, но он мне не понравился и я другой сотворил. Но мой почемуто не работает function noweap() -- выкидываем оружие если нет экзы local exza = db.actor:item_in_slot(6) -- локальные local grena = db.actor:item_in_slot(2) -- переменные if exza ~= "exo_outfit" then -- проверяем экзу if grena and grena == "wpn_gauss" or grena == "wpn_rpg7" or grena == "wpn_fn2000" then -- проверяем оружие db.actor:drop_item(grena) -- выбрасываем news_manager.send_tip(db.actor,"Слишком тяжёлое оружие для обычной брони, оденьте эгзоскелет",nil,nil,10000) -- сообщаем об этом end end end Что в нём не так? Луа чекером проверял, вылетов при проверке из игры нет но работать он не хочет Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564329
Garry_Galler 7 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 TRAMP14 db.actor:item_in_slot(6) возвращает юзердату, а не строку. Так что твое сравнение дает false. Для того, чтобы получить строку с наименованием объекта по секции нужно предварительно применить к нему метод section(). if exza and exza:section()~= "exo_outfit" then if grena and (grena:section() == "wpn_gauss" и т.д.) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564345
TRAMP14 1 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 Всё заработало, спасибо. Вот ещё скриптик - тоже неработает Смена худа при смене костюмов function prost() local hud = get_hud() local cs = hud:GetCustomStatic("nov_outfit") local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then if item_in_slot == "novice_outfit" or item_in_slot == "bandit_outfit" or item_in_slot == "killer_outfit" or item_in_slot == "monolit_outfit" or item_in_slot == "soldier_outfit" or item_in_slot == "stalker_outfit" or item_in_slot == "svoboda_light_outfit" or item_in_slot == "svoboda_heavy_outfit" or item_in_slot == "dolg_outfit" or item_in_slot == "outfit_novice_m1" or item_in_slot == "outfit_bandit_m1" or item_in_slot == "outfit_dolg_m1" or item_in_slot == "outfit_killer_m1" or item_in_slot == "outfit_specnaz_m1" or item_in_slot == "outfit_stalker_m1" or item_in_slot == "outfit_stalker_m2" or item_in_slot == "outfit_svoboda_m1" then if cs == nil then hud:AddCustomStatic("nov_outfit", true) cs = hud:GetCustomStatic("nov_outfit") end else if cs ~= nil then hud:RemoveCustomStatic("nov_outfit") end end end end function okylar() local hud = get_hud() local cs = hud:GetCustomStatic("okul") local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then if item_in_slot == "dolg_scientific_outfit" or item_in_slot == "ecolog_outfit" or item_in_slot == "protection_outfit" or item_in_slot == "scientific_outfit" then if cs == nil then hud:AddCustomStatic("okul", true) cs = hud:GetCustomStatic("okul") end else if cs ~= nil then hud:RemoveCustomStatic("okul") end end end end function protivogaz() local hud = get_hud() local cs = hud:GetCustomStatic("protivgaza") local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then if item_in_slot == "outfit_exo_m1" or item_in_slot == "exo_outfit" then if cs == nil then hud:AddCustomStatic("protivgaza", true) cs = hud:GetCustomStatic("protivgaza") end else if cs ~= nil then hud:RemoveCustomStatic("protivgaza") end end end end function shlemi() local hud = get_hud() local cs = hud:GetCustomStatic("shlem") local item_in_slot = db.actor:item_in_slot(6) if item_in_slot ~= nil then if item_in_slot == "specops_outfit" or item_in_slot == "military_outfit" then if cs == nil then hud:AddCustomStatic("shlem", true) cs = hud:GetCustomStatic("shlem") end else if cs ~= nil then hud:RemoveCustomStatic("shlem") end end end end Правда в первой функции перечислений много. Она также не работает - худы не выводятся, вылетов нет Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564348
Nazgool 250 Опубликовано 12 Февраля 2011 Поделиться Опубликовано 12 Февраля 2011 (изменено) TRAMP14 Тебе же выше уже объяснили почему не работает. А теперь вот что. Допустим ты без костюма и статик не установлен. (Смотрим в любой из функций) 1. Одеваешь костюм : if item_in_slot ~= nil then -- Истина (костюм уже надет - не равен NIL) ... if cs == nil then -- Истина (статик пока не установлен) hud:AddCustomStatic("okul", true) --установить статик 2. Снимаешь костюм : if item_in_slot ~= nil then -- Ложь (Слот уже пуст - равен NIL) ... end end -- функция отработала, НО ! Костюм уже снят, а кто статик будет удалять? Ну и наконец, даже если бы работало, то всё это получилось достаточно затратно в ресурсах. Можно сделать не только одной функцией, но и оптимизировать. Например : function HandlerStatic() local hud = get_hud() local item_in_slot = db.actor:item_in_slot(6) local cs --Если установлен хотя бы один из статиков, задать переменной "cs" значение, отличное от "лжи" if hud:GetCustomStatic("nov_outfit") then cs = "nov_outfit" elseif hud:GetCustomStatic("okul") then cs = "okul" elseif hud:GetCustomStatic("protivgaza") then cs = "protivgaza" elseif hud:GetCustomStatic("shlem") then cs = "shlem" end -- Проверить, надет ли броник... if item_in_slot then -- если надет... if cs then return end -- ...и есть статик - прекратить работу функции local item_section = item_in_slot:section() if item_section == "specops_outfit" or item_section == "military_outfit" then cs = "nov_outfit" elseif item_section == "outfit_exo_m1" or item_section == "exo_outfit" then cs = "protivgaza" elseif item_section == "dolg_scientific_outfit" or item_section == "ecolog_outfit" or item_section == "protection_outfit" or item_section == "scientific_outfit" then cs = "okul" else cs = "nov_outfit" -- предполагаю что тут все остальные костюмы. Может ошибаюсь. end -- если надет и нет статика, то установить статик hud:AddCustomStatic(cs, true) elseif not cs then return -- если броник не надет и нет статика, то прекратить работу функции else -- если броник не надет и есть статик, то удалить статик hud:RemoveCustomStatic(cs) end end Изменено 12 Февраля 2011 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564438
TRAMP14 1 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 СпасибО! Вот такой вопрос - есть ли правила когда ставить db.actor:item_in_slot(6) а когда db.actor:item_in_slot(6):section()? А то я почти никогда не ставил и все работало. А сейчас на тех же сравнениях требуется ставить :section() Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564571
UX-3000 26 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 (изменено) Не подскажете как создать логовище полтергейста на Заводе Юпитер, ну там где входите в главный корпус, когда ищете вертолёт, вроде бы точка Б8. Там много разбросанных вещей, подходящих под метательные снаряды. Хотелось бы создать точку респауна полтергейстов с их постоянным респапуном в этом месте. Как лучше это сделать и какую примерно логику лучше использовать? Изменено 13 Февраля 2011 пользователем UX-3000 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564572
Stalk15 27 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 TRAMP14 Странноватый вопрос у тебя. Если ты хочешь просто проверить, есть ли итем в слоте или нет, то можно так писать: local gg = db.actor:item_in_slot(6) if gg~=nil then А если тебе надо узнать, какой именно итем в слоте, то тогда надо использовать section(). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564582
Garry_Galler 7 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 (изменено) TRAMP14 Уясни наконец разницу между юзердатой и строкой. И вспомни - когда ты использовал только юзердату, с чем ты ее сравнивал? С nil. То есть делал типа того: if db.actor:item_in_slot(6) ~= nil then - это просто проверка, что предмет в слоте(экземпляр класса) не nil (то есть что там есть хоть какой то предмет - не важно какой секции). Юзердата, которую возвращает метод item_in_slot(number) , в данном случае это просто экземпляр объекта определенного класса вообще. Как допустим ты - экземпляр класса homo sapiens. Но все люди разные и экземпляры объекта одного и того же класса тоже разные. Например у них разные имена - секции. И как раз метод section() их возвращает. Разница между юзердатой и строкой - огромная. Это совершенно разные типы. И их нельзя (потому что бессмысленно) сравнивать друг с другом. Поэтому когда тебе нужно сравнить секцию объекта с другой секцией (а это строки) нужно применять метод section(). (или section_name() для серверных объектов). Изменено 13 Февраля 2011 пользователем Garry_Galler Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564595
_Призрак_ 11 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 TRAMP14 Давай представил что у тебя в слоте №6 не оружие, а кот. Если ты применяешь такую функцию: local gg = db.actor:item_in_slot(6), то ты как бы берешь кота за шиворот и можешь делать с ним все что угодно. Выкинуть, узнать его имя, массу, рост и т.д. А если ты используешь функцию db.actor:item_in_slot(6):section() то ты только узнаешь имя кота, его секцию в файле итем. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-564596
TRAMP14 1 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 (изменено) Ещё хотел спросить что тут правильно: object():section() db.actor:object():section() object:section() obj:section()? Или есть ещё какие либо варианты? 1 и 2 дают вылеты Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ... shadow of chernobyl\gamedata\scripts\glavnaa.script:2: attempt to index a number value Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ... shadow of chernobyl\gamedata\scripts\glavnaa.script:2: attempt to call method 'section' (a nil value) Боюсь и остальные тоже Изменено 14 Февраля 2011 пользователем TRAMP14 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565127
ColR_iT 171 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 TRAMP14, object:section() и obj:section() одно и тоже! Что значит правильно? Что ты хочешь сделать? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565134
TRAMP14 1 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 Чтобы при использовании предмета появлялся худ. Конечно старая битая тема но у меня скока пробую везде оставновка на етой функции Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565152
_Призрак_ 11 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 object():section() - это вообще непонятно что. Максиум, если у тебя есть функция, которая возвращает объект, то тогда это будет рабочее. Но только если у тебя есть функция object() в данном скрипте, которая возвращает объект. Тогда эта строка возвратит секцию объекта, которого возвращает функция object() db.actor:object():section() - вооще вылетит в любом случае. Ибо ты пытаешься получить объект nil у актора. object:section() и obj:section() это одно и тоже. Получаешь объект каким либо образом, и применяешь к нему метод section(). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565161
TRAMP14 1 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 Мне надо посмотреть какой обьект используется и сравнить его с тем который мне нужен, в статье "Звук при использовании предмета" именно ета функция. из неё я собственно и брал. Но вылет Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565169
ColR_iT 171 Опубликовано 14 Февраля 2011 Поделиться Опубликовано 14 Февраля 2011 TRAMP14, тебе же выше писали, если ты хочешь сравнить объект по секции (тип данных string), то сравнивать нужно так: local obj = db.actor:item_in_slot(6) local obj_section = obj:section() if obj_section == "stalker_outfit" then , если ты напишешь так: obj = db.actor:item_in_slot(6) if obj_section then , то ты просто проверишь, есть ли вообще, что нибудь в слоте! И таким образом ты можешь делать все, что позволяет класс, к которому принадлежит этот объект. obj - это экземпляр класса. Например, Карась - это экзепляр класса Рыба, а Щука - это уже другой экземпляр, того же класса! Через экземпляр класса ты можешь получить его имя: local obj_name = obj:name() , уникальный идентификатор объекта: local obj_id = obj:id() , позицию: local obj_position = obj:position() , гейм вертекс: local obj_gv = obj:game_vertex_id() и так далее и тому подобное. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/74/#findComment-565193
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти