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 Ссылка на комментарий
WinCap 323 Опубликовано 25 Мая 2023 Поделиться Опубликовано 25 Мая 2023 @Norman Eisenherz на чистом ЗП приведенный код работает без проблем, ищи причину вылета в другом. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 25 Мая 2023 Поделиться Опубликовано 25 Мая 2023 Файл для проверки: https://drive.google.com/file/d/1rwtL6G7nwbLGTpZEV0yEOJt1lEq2f8PA Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 308 Опубликовано 25 Мая 2023 Поделиться Опубликовано 25 Мая 2023 Подтверждаю то, что написал @WinCap 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 26 Мая 2023 Поделиться Опубликовано 26 Мая 2023 При нажатии указанных клавиш выводится сообщение в консоль, правильно? 2 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Labadal 68 Опубликовано 26 Мая 2023 Поделиться Опубликовано 26 Мая 2023 Здравствуйте, подскажите - возможно вообще телепортировать непися на нужные мне (walk и look) координаты? God save Hatsune Miku! Ссылка на комментарий
dsh 3 824 Опубликовано 27 Мая 2023 Поделиться Опубликовано 27 Мая 2023 @Labadal конкретно телепортировать - это зависит от используемого движка. В общем OGSR - можно. Но ведь в любом случае, даже используя оригинальный движок, можно удалить на старом месте и создать на новом. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
phalcor 60 Опубликовано 30 Мая 2023 Поделиться Опубликовано 30 Мая 2023 Доброго дня! Есть оригинальный каллбэк на смерть физических объектов (ящиков и т.п.): function generic_physics_binder:death_callback(victim, who) Хочу идентифицировать, КТО "убил" ящик, но who:id(), who.id, who:section(), who:section_name() и т.д. вызывают вылет - нет такого метода. Подскажите, кто знает, как же можно идентифицировать who? Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 30 Мая 2023 Поделиться Опубликовано 30 Мая 2023 В оригинале, видимо, только через костыли. В Anomaly есть какие-то правки и рабочее испытание "разбить 200 ящиков" с проверкой who:id() = db.actor:id(). Есть вариант зацепиться за событие спавна лута в [xr_box.script] и перебрать db.storage на предмет живых объектов рядом с ящиком, но это не позволит точно определить, кто именно разбил ящик гранатой в перестрелке. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
phalcor 60 Опубликовано 30 Мая 2023 Поделиться Опубликовано 30 Мая 2023 27 минут назад, Norman Eisenherz сказал: В оригинале, видимо, только через костыли. Самое интересное, что в том же generic_physics_binder:hit_callback(obj, amount, local_direction, who, bone_index) прекрасно работает who:id(), и тогда я сделал там сохранение своей глобальной переменной kto_ubil = who, чтобы потом в death_callback её читать, но тут снова затык: если hit убивает ящик, то нет вызова hit_callback, а сразу - death_callback Ладно, будем искать... Ссылка на комментарий
Labadal 68 Опубликовано 2 Июня 2023 Поделиться Опубликовано 2 Июня 2023 Добрый день, возможно как-то получить количество определённых вещей на поясе? (Например, количество медуз) Спасибо God save Hatsune Miku! Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 5 Июня 2023 Поделиться Опубликовано 5 Июня 2023 [ТЧ 1.0006] Правка "отдавать артефакты сначала из инвентаря, потом с пояса". Spoiler [scripts\dialogs.script] function relocate_item_section(victim, section, type) … elseif type == "out" then (–) db.actor:transfer_item(db.actor:object(section), victim) (+) local inv_item = db.actor:object(section) db.actor:inventory_for_each( function(item) if item:section() == section then inv_item = item break end end ) db.actor:transfer_item(inv_item, victim) Безлоговый вылет при остановке перебора через break. В движке перебор описан как for(it = item_list.begin(); item_list.end() != it; ++it) – такой цикл должен быть совместим с break. Или нет? Как правильно остановить перебор инвентаря при обнаружении одного предмета? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 308 Опубликовано 5 Июня 2023 Поделиться Опубликовано 5 Июня 2023 @Norman Eisenherz я не знаток С++, но скорее всего break внутри выполняемой функции работает только в контексте этой функции, а поскольку никакого цикла в ней нет, такая команда приводит к исключению. Более того, поскольку в нет и обработки и возвращаемого из functor значения (можно было бы вернуть true или false для остановки, как это сделано, например, в level.add_call для проверки выполнения условия), то и этот метод не пойдёт. Отсюда ответ - никак. А потому я бы переписал код так, чтобы после первого найденного предмета он сохранял его, не меняя больше: local inv_item = nil db.actor:inventory_for_each(function(item) if inv_item == nil and item:section() == section then inv_item = item end end) if inv_item then db.actor:transfer_item(inv_item, victim) end 2 1 2 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 6 Июня 2023 Поделиться Опубликовано 6 Июня 2023 @Kirgudu Сделал примерно то же через логический флаг; хотелось устранить лишние действия, но раз никак… Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 348 Опубликовано 15 Июня 2023 Поделиться Опубликовано 15 Июня 2023 30.05.2023 в 16:25, phalcor сказал: function generic_physics_binder:death_callback(victim, who) Хочу идентифицировать, КТО "убил" ящик, но who:id(), who.id, who:section(), who:section_name() и т.д. вызывают вылет - нет такого метода. Подскажите, кто знает, как же можно идентифицировать who? Так вы бы и разбирались для начала, передан ли вообще who, и что он из себя представляет. Вылет происходит когда вы дергаете методы не удостоверившись в их наличии, а также наличии самого объекта. if who and type(who) == 'userdata' then if type(who.id) == 'number' then log("who - серверный объект") -- НЕ КЛИЕНТСКИЙ! -- Здесь можно смело использовать who.id, who:section_name(), и другие методы и свойства СЕРВЕРНОГО объекта. elseif type(who.id) == 'function' then log("who - клиентский объект") -- НЕ СЕРВЕРНЫЙ! -- Здесь можно смело использовать who:id(), who:section(), и другие методы и свойства КЛИЕНТСКОГО объекта else log("who - объект, но не серверный и не клиентский. Вообще непонятно что.") -- Такого скорее всего не произойдет никогда. Ну, или почти. end else log("who not found") -- Объект не был передан. end -- Главное не путайте серверные и клиентские объекты между собой. 2 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 15 Июня 2023 Поделиться Опубликовано 15 Июня 2023 Если в трех скриптах [bind_stalker / bind_monster / xr_motivator] это работает одинаково, то первым действием в четвертом скрипте будет все же повтор, а не проверка – какой смысл пенять новичкам, что они не знают ВСЕГО и не предполагают наличия кочки на ровном месте? Проверили: userdata неизвестного класса – та самая неведома зверушка, которая не должна существовать, но выдается при каждом срабатывании скрипта в момент разрушения ящика. Как скриптовыми методами определить класс такого объекта? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 348 Опубликовано 15 Июня 2023 Поделиться Опубликовано 15 Июня 2023 1 час назад, Norman Eisenherz сказал: та самая неведома зверушка, которая не должна существовать, но выдается при каждом срабатывании скрипта А подскажите какой точно движок вы используете? Методы биндера вызывает именно движок, и если есть его код то смотреть надо там. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 16 Июня 2023 Поделиться Опубликовано 16 Июня 2023 Движок ТЧ 1.0006 Есть некоторая разница в ссылке на объект who при убийстве живого объекта и ящика. В случае с ящиком выдается, видимо, чистый класс CGameObject. Spoiler [xrGame\DestroyablePhysicsObject.cpp] void CDestroyablePhysicsObject::Destroy() … const CGameObject *who_object = smart_cast<const CGameObject*>(FatalHit().initiator()); callback(GameObject::eDeath)(lua_game_object(),who_object ? who_object : 0); [xrGame\entity_alive.cpp] void CEntityAlive::Die (CObject* who) … const CGameObject *who_object = smart_cast<const CGameObject*>(who); callback(GameObject::eDeath)(lua_game_object(), who_object ? who_object->lua_game_object() : 0); Методов чистого класса всего ничего: Spoiler C++ class CGameObject : DLL_Pure,ISheduled,ICollidable,IRenderable { CGameObject (); function Visual(); function getEnabled() const; function _construct(); function net_Import(net_packet&); function getVisible() const; function net_Export(net_packet&); function net_Spawn(cse_abstract*); function use(CGameObject*); }; Как добраться до id или секции объекта? Например, who:Visual() выдает не путь до модели, а что-то с типом userdata – видимо, саму модель, но применение к этой "модели" методов visual-классов дает вылет "нет такого метода для данного класса". Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 348 Опубликовано 17 Июня 2023 Поделиться Опубликовано 17 Июня 2023 Ну баг движка значит. 7 часов назад, Norman Eisenherz сказал: Как добраться до id или секции объекта? Передать в колбек нормальный lua_game_object, собрать движок. 7 часов назад, Norman Eisenherz сказал: ТЧ 1.0006 А лучше не заниматься странной фигней и взять OGSR например. Там эта строчка была в порядке еще в 2019 году. 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 4 Июля 2023 Поделиться Опубликовано 4 Июля 2023 (изменено) [ТЧ 1.0006] Если я ничего не путаю, функция, запускаемая через level.client_spawn_manager():add(…, fx), должна срабатывать после выхода заданного объекта в онлайн. При спавне объекта в инвентарь и проверке его наличия получается nil, при повторном спавне определяется только один объект и так далее с отставанием в один шаг – только что созданный объект не ловится. Объект выходит в онлайн, но не успевает получить привязку родительского объекта (ГГ)? Spoiler local sect = "wpn_fn2000_arena" function test() local spawn = alife():create(sect, vector(), 0, 0, 0) level.client_spawn_manager():add(spawn.id, -1, check) end function check(id, obj) if db.actor:object(sect) then _utils.sms(1) end end Изменено 4 Июля 2023 пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 308 Опубликовано 5 Июля 2023 Поделиться Опубликовано 5 Июля 2023 (изменено) @Norman Eisenherz я б сказал, что родительский объект не успевает получить информацию об этой привязке. Сама привязка существует уже в момент спавна; достаточно после выхода нового объекта в онлайн проверить свойство parent_id (серверное) - оно будет равным id контейнера (актора). Но это единственное свойство, которое изменяется при помещении одного объекта внутрь другого. Поскольку методы поиска дочернего объекта (:object(), :iterate_inventory() и :inventory_for_each()) работают не со всеми объектами игры - это было бы неоправданно долго, а с динамической коллекцией подчинённых объектов контейнера, требуется, чтобы эта коллекция также обновилась на клиенте. А это происходит, очевидно, на апдейте уже после выхода созданного дочернего объекта в онлайн. Если требуется проверить, что объект создан внутри контейнера, можно посмотреть parent_id или подождать апдейт-другой. Изменено 5 Июля 2023 пользователем Kirgudu 1 1 2 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти