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 Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 10 Апреля 2019 Поделиться Опубликовано 10 Апреля 2019 Я опять встрял, и не могу понять, во что именно… Есть две функции: одна привязана к "info_callback" и спавнит предмет в момент начала торговли, другая запускается после спавна предмета и должна получить его id. Как только я пытаюсь добавить в аргументы второй функции "info_id" для дальнейших действий на основании инфо-поршней из основного колбэка, функция перестает видеть созданный объект, хотя вызывается строго после его создания. Может ли проблема быть в том. что в первой функции создаются два объекта, а колбэк только на одном? Код ниже, требуется передать (info_id) в функцию "transfer". Spoiler function box_id(sect) for i = 0, 65535 do local obj = level.object_by_id(i) if obj and obj:section() == sect then return obj:id() end end end function box_spawn(info_id) local act = db.actor if info_id == "ui_trade" then local act_pos = act:position() alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() ) local spawn = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) level.client_spawn_manager():add(spawn.id, -1, transfer) end end function transfer() local act = db.actor local box_1 = box_id("box_eq") local box_2 = box_id("box_ex") if box_1 and box_2 then news_manager.send_tip(act, "spawned") else news_manager.send_tip(act, "missing") end end Переделал вызовы так, чтобы "info_id" читался непосредственно в "bind_stalker", а функция, зависящая от спавна, только перебрасывала предметы. С одной коробкой работает, с двумя – не переносятся предметы из второй коробки, хотя id второй коробки читается правильно и предметы _в_ эту коробку точно переносятся, если что-нибудь купить (коробки на время теста не удаляются). Посмотрите, пожалуйста, кто-нибудь, где я косячу: https://drive.google.com/open?id=1ak0_jspeRXxoTxxHIDLCe-J0-Psp41DS Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 255 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @Norman Eisenherz, у тебя id заспавненных предметов есть уже сразу после спавна. Зачем корячить ещё и какой-то поиск по десяткам тысяч объектов? local spawn1 = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() ) local spawn2 = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) local box_1_id = spawn1.id local box_2_id = spawn2.id Возможно, требуется сделать что-то другое, кроме как получить id предметов (например: заспавнить 2 предмета, дождаться выхода в онлайн обоих, после чего что-то сделать с их клиентскими объектами), но тогда опиши человеческим языком, что именно. Инструмент Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @Kirgudu Не "возможно", а так и есть – надо дождаться выхода в онлайн, чтобы потом переносить объекты в созданные коробки. Ссылку на id я могу передать только на один объект в одном колбэке, поэтому второй все равно придется искать через перебор (если только колбэк не понимает две пары аргументов "id, obj"). Во втором посте как раз вариант с прямой передачей одного id вместо ссылки на info_id общего колбэка. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 2 часа назад, Norman Eisenherz сказал: Ссылку на id я могу передать только на один объект в одном колбэке Не правда... Учи луа и экспортированные ф-ции движка Аргументом в ф-ции кэллбэка может быть и таблица, в которую можно без проблем положить идентификаторы любого кол-ва объектов... Ссылка на комментарий
Баба ЯГА 7 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 Создал свою текстуру, например: moy_textura.dds , её надо где-то регистрировать? Или можно так использовать? 1 Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
BFG 7 582 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @Баба ЯГА, Причём здесь тема скриптования ? Строгое предупреждение за оффтоп. Текстуру можешь регить, можешь нет. Движок всё равно её обсчитает. Загляни файл textures.ltx и всё поймешь. Остальное есть в профильных темах и на Сталкер-Вики. "Кругом зомби.....у меня кончаются патроны...." Ссылка на комментарий
Баба ЯГА 7 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @BFG, однако, спасибо за подсказку и наводку! Ушёл курить textures.ltx (я, отчего-то решил, что любое ковыряние в игре, это - скриптование ... ну, как говорится: "и на старуху - бывает проруха".) Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @AndreySol Попробовал создать два объекта в одной функции – получается два тестовых сообщения с разными id объектов. Это предполагаемый результат, или как-то можно передать две пары "id, obj" в одном вызове функции? Spoiler function drop_check(obj) -- [bind_stalker] on_item_drop(obj) if obj:section() == "hand_radio" then spawn() end end function spawn() local act = db.actor local item = { "bandage", "medkit" } for k, v in pairs(item) do local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id()) level.client_spawn_manager():add(spawn.id, -1, test_msg) end end function test_msg(id, obj) news_manager.send_tip(db.actor, "obj: " .. obj:section() .. ", id: " .. id) end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 255 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 (изменено) @Norman Eisenherz, разных способов можно придумать. Например: Скрытый текст local spawned = {} function spawn() local act = db.actor local item = { "bandage", "medkit" } for _,v in ipairs(item) do local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id()) table.insert(spawned, {id = spawn.id, obj = spawn}) level.client_spawn_manager():add(spawn.id, -1, test_msg) end end function test_msg(id, obj) if #spawned == 2 then for _,v in ipairs(spawned) do news_manager.send_tip(db.actor, "obj_section: " .. v.obj:section() .. ", v.id: " .. v.id) end end end Кроме того, существует перегрузка метода: level.client_spawn_manager ():add(spawn.id, -1, spawn_callback, arg) где arg - дополнительный аргумент, в который можно передать что угодно, в том числе произвольную таблицу, как совершенно справедливо заметил @AndreySol. Тогда колбэк будет выглядеть так: function spawn_callback(arg, id, obj) -- переданный дополнительный аргумент идёт первым end Изменено 11 Апреля 2019 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Баба ЯГА 7 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 Кто знает, как проверить момент, когда ГГ берёт в руки труп? или ящик? и т.д. Именно в руки. Например, ГГ взял в руки труп и в этот момент в лог должно вывести сообщение, что ГГ взял в руки какой-то там obj:name() ну или любое сообщение. Как отловить это действо? Перепробовал всё что было в bind_stalker - не нашёл отклика. Может не там смотрю? Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 Вопрос по функции transfer_item: ссылка дается на секцию предмета, и если в инвентаре несколько предметов с одинаковыми секциями, часто передается не тот, что в слоте. Попытка сослаться на id() вместо секции (как в варианте alife():release) делает функцию "пустышкой" – вылета нет, но и эффекта тоже никакого. Какую проверку можно ввести для точного определения предмета? Spoiler function items_out(box_id) local act = db.actor local box = level.object_by_id(box_id) local n = {1, 2, 6} for k, v in pairs(n) do local slot = act:item_in_slot(v) if slot then act:transfer_item( act:object( slot:section() ), box ) -- здесь ошибка end end end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 @Norman Eisenherz 52 минуты назад, Norman Eisenherz сказал: act:object( slot:section() Это зачем ??? У тебя же в переменной slot уже находится объект из соответствующего слота, ее и используй в transfer_item. 1 Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 11 Апреля 2019 Поделиться Опубликовано 11 Апреля 2019 (изменено) @AndreySol Есть контакт. Уже не помню, где я нашел образец с секцией, но это явно сбило меня с толку. Изменено 11 Апреля 2019 пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
_Sk8_AsTeR_ 122 Опубликовано 14 Апреля 2019 Поделиться Опубликовано 14 Апреля 2019 Времени доброго, знатоки! Подскажите по возможности, как, каким образом перебрать нетпакеты всех живых НПС, чтобы выдернуть имя абсолютно случайного живого НПС? Ссылка на комментарий
Norman Eisenherz 322 Опубликовано 14 Апреля 2019 Поделиться Опубликовано 14 Апреля 2019 (изменено) Здрасьте. При использовании скрипта для исключения экипированных предметов на время торговли/обыска случается вылет со ссылкой на слоты экипировки в порядке "пистолет > автомат > броня" (при наличии), если открыть и тут же закрыть труп или контейнер. Можно ли эту ошибку обойти в самом коде? Триггер скрипта – info_callback в [bind_stalker.script] Spoiler Expression : e_entity->ID_Parent == id_parent Function : xrServer::Process_event_reject File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp Line : 23 Description : wpn_sig22029705 Arguments : single_player Spoiler local act = db.actor local box_1 = 0 local box_2 = 0 -- // проверка наличия активного противника в радиусе охвата мини-карты // -- function enemy() for i = 0, 65535 do local obj = level.object_by_id(i) if obj and obj:alive() and ( obj:relation(act) == game_object.enemy or IsMonster(obj) ) and obj:position():distance_to( act:position() ) < 30 then return true end end return false end -- // спавн коробок и отслеживание ввода в онлайн // -- function spawn_box_1(info_id) if info_id == "ui_trade" or info_id == "ui_car_body" then local act_pos = act:position() local spawn = alife():create( "box_eq", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) level.client_spawn_manager():add(spawn.id, -1, transfer_out) end end function spawn_box_2(info_id) if info_id == "ui_trade_hide" or info_id == "ui_car_body_hide" then local act_pos = act:position() local spawn = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) level.client_spawn_manager():add(spawn.id, -1, transfer_back) end end -- // перенос предметов // -- function transfer_out(id, obj) box_1 = id -- news_manager.send_tip(act, "out_1: " .. box_1) items_out(box_1) end function transfer_back(id, obj) box_2 = id -- news_manager.send_tip(act, "out_2: " .. box_2) items_out(box_2) -- news_manager.send_tip(act, "back_1:" .. box_1) items_back(box_1) spawn_dl() end function spawn_dl() -- костыль для задержки на время переноса предметов в доп. коробку local act_pos = act:position() local spawn = alife():create( "box_dl", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) level.client_spawn_manager():add(spawn.id, -1, transfer_end) end function transfer_end(id, obj) alife():release( alife():object(id) ) -- удаление костыля -- news_manager.send_tip(act, "back_2:" .. box_2) items_back(box_2) if enemy() == false then -- news_manager.send_tip(act, "все тихо, выбор болта") act:activate_slot(5) elseif enemy() == true and act:item_in_slot(2):section() == "wpn_vintorez" and act:item_in_slot(1) then act:activate_slot(2) -- небольшая правка - винторез стабильно пролетает в слоты до пистолетов end end -- // перенос предметов в коробку // -- function items_out(box_id) local box = level.object_by_id(box_id) local n = {1, 2, 6} for k, v in pairs(n) do local slot = act:item_in_slot(v) if slot then act:transfer_item(slot, box) end end end -- // перенос предметов из коробки и ее удаление // -- function items_back(box_id) local box = level.object_by_id(box_id) local storage = {} for i = 0, 65535 do local obj = level.object_by_id(i) if obj and obj:parent() and obj:parent():id() == box_id then table.insert(storage, i) end end if next(storage) ~= nil then for k, v in pairs(storage) do local item = level.object_by_id(v) box:transfer_item(item, act) end -- else news_manager.send_tip(act, "empty box") end alife():release( alife():object(box_id) ) end Изменено 14 Апреля 2019 пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 14 Апреля 2019 Поделиться Опубликовано 14 Апреля 2019 3 часа назад, _Sk8_AsTeR_ сказал: каким образом перебрать нетпакеты всех живых НПС, чтобы выдернуть имя абсолютно случайного живого НПС А нет-пакеты зачем тебе ? Достаточно просто перебрать все объекты, и для тех из них, кто является сталкером, получить имя: for i = 1, 65535 do local obj = alife():object(i) if obj and IsStalker(obj) then local text = obj:name() -- тут и есть имя сталкера end end Получаемые имена стоит сложить в таблицу, из которой потом рандомно выдернуть любое. 1 Ссылка на комментарий
Graff46 598 Опубликовано 15 Апреля 2019 Поделиться Опубликовано 15 Апреля 2019 @AndreySol, возможно имелось ввиду игровое емя, которое высвечивается в диалоге, такое имя можно получить вроде как только у клиентского объекта или в нет пакете Ссылка на комментарий
_Sk8_AsTeR_ 122 Опубликовано 16 Апреля 2019 Поделиться Опубликовано 16 Апреля 2019 В 15.04.2019 в 00:07, AndreySol сказал: local text = obj:name() -- тут и есть имя сталкера Сделал функцию, чтобы на экран игровой выводилось значение переменной text Возвращается что-то типа esc_stalker_01_784766 А как можно добиться именно игрового имени? "Андрей Блатной", "Сережа Жыжа" и тдтп? Пробовал извращаться с get_npc_name(obj), но тщетно Ссылка на комментарий
Overfirst 637 Опубликовано 16 Апреля 2019 Поделиться Опубликовано 16 Апреля 2019 local text = obj:character_name() 1 1 Ранее был известен под ником BoBaH_671. Ссылка на комментарий
_Sk8_AsTeR_ 122 Опубликовано 17 Апреля 2019 Поделиться Опубликовано 17 Апреля 2019 А позвольте абсолютно нубский вопрос... Что значат эи вездесущие цифры "65535"? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти