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 Ссылка на комментарий
Карлан 1050 Опубликовано 12 Февраля 2017 Поделиться Опубликовано 12 Февраля 2017 "Если оно создавалось, чтобы игрок его увидел, то подумать: а как, собственно, он это сможет увидеть ?" Да это понятно, Меня больше принципиальный подход интересует, что и зачем чистить каждый сам решает. Ссылка на комментарий
Dennis_Chikin 3664 Опубликовано 12 Февраля 2017 Поделиться Опубликовано 12 Февраля 2017 (изменено) Вот это и есть тот самый принципиальный принцип: набить тыщщу профилей неписей, каждый с гранатами 5 видов, а потом гранатометательный скрипт их удаляет при входе в онлайн, и в ходе в офлайн, и еще в апдейте в 20-70 ms проверяет, а не прошла ли секунда с того момента, как что-то удалялось или создавалось, и создает/удаляет что-то еще. Особенно круто, когда такое пытаются сделать ТРИ скрипта одновременно, а четвертый удаляет оружие, которое 2-й назначил парентом гранаты, удаляемой третьим. Ну а до кода - ну вот я тебе клинер не-сяковский давал. Вообще совсем не сяковский. Изменено 12 Февраля 2017 пользователем Dennis_Chikin Ссылка на комментарий
dsh 3824 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 для меня 300 мс это фриз Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик. Ссылка на комментарий
Карлан 1050 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик. 300 мс это весьма ощутимый фриз, доложу я тебе, и увеличивать время загрузки мне совсем не хочется. Так как да, потом дойдет и до 3, и до 30. Сравнение странное, как-будто ты грузишь либо текстуры, либо модели, в общем что-то одно. Ссылка на комментарий
Bak 757 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 @Карлан, Я вот тебя не понимаю, об чём эти цыфери? Не устраивает имеющийся в движке массив объектов? И ты решил свой собственный заделать на луа, занося-вынося туда десятки тысяч объектов, ради какого высшего блага? Ссылка на комментарий
pc-2 139 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 (изменено) Всем привет, объясню суть проблемы. Создаю новый предмет - копирую сецию премета напр. konserva, меняю название на kurevo затем добовляю функцию в скрипт. Выглядит так function del_kurevo() local oitem = db.actor:item_in_slot(1) if oitem then db.actor:drop_item(oitem) alife():release(alife():object(oitem:id()), true) alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) db.actor:object("kurevo") db.actor:eat(db.actor:object("kurevo")) news_manager.send_tip(db.actor, "покурил, теперь за дело!", 0, "actor", 5000) end end Функция работает, сообщение приходит, предмет kurevo появляется в рюкзаке, но не используется, функция db.actor:eat(db.actor:object("kurevo")) не срабатывает. В чём может быть проблема? Зараннее спасибо. Изменено 13 Февраля 2017 пользователем pc-2 Добавлено HellRatz, 13 Февраля 2017 В теме "Уроков" в шапке красным по белому написано для чего та тема. Устное предупреждение. Перемещено куда полагается. Ссылка на комментарий
dsh 3824 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 @pc-2, вот между двумя этими строчками alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) db.actor:object("kurevo") kurevo в инвентаре еще не появится. Оно появится позже, когда твой код завершит работу и управление вернется движку. Прежде, чем его есть, нужно дождаться, когда оно появится. Вот так, к примеру level.client_spawn_manager():add( sobj.id, -1, function( id, obj ) db.actor:eat( obj ) end ) Ссылка на комментарий
Dennis_Chikin 3664 Опубликовано 14 Февраля 2017 Поделиться Опубликовано 14 Февраля 2017 (изменено) Дискуссия об "должностных обязанностях" переехала в курилку.Каждый наклон головыВ Торе детально расписан,Сложен Путь Самурая ! Изменено 14 Февраля 2017 пользователем Dennis_Chikin 1 Ссылка на комментарий
pc-2 139 Опубликовано 14 Февраля 2017 Поделиться Опубликовано 14 Февраля 2017 (изменено) @dsh, Я сделал как вы написали получилась вот такая функция: function del_kurevo() local oitem = db.actor:item_in_slot(1) if oitem then db.actor:drop_item(oitem) alife():release(alife():object(oitem:id()), true) alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) level.client_spawn_manager():add(sobj.id, -1, function( id, obj )db.actor:eat( obj )end) db.actor:object("kurevo") db.actor:eat(db.actor:object("kurevo")) news_manager.send_tip(db.actor, "покурил, теперь за дело!", 0, "actor", 5000) end end получил вот такой вылет: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...iles (x86)\op 2.1\gamedata\scripts\xr_smoking.script:82: attempt to index global 'sobj' (a nil value) А, вот так всё работает! function del_kurevo() local oitem = db.actor:item_in_slot(1) if oitem then db.actor:drop_item(oitem) alife():release(alife():object(oitem:id()), true) --alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) alife():create("conserva", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) --db.actor:object("kurevo") db.actor:object("conserva") --db.actor:eat(db.actor:object("kurevo")) db.actor:eat(db.actor:object("conserva")) news_manager.send_tip(db.actor, "покурил, теперь за дело!", 0, "actor", 5000) и даже чавкает. Проблема скорее всего в созданном объекте "kurevo"- игра не знает как его использовать ( съесть, выпить, использовать ). Ну в этом я конечно не уверен, а, есть ли такая таблица распределения. А что-бы вам более понятно было, я адаптировал из мода Альтернатива -анимацию курение (ну это просто моё хобби чё-то перетащить с одного мода в другой) в ОП-2, ну так как курить это просто время терять, а, в скриптах я вообще полный 0. Но я захотел что-бы курение защищало немного от псивоздействия и чуть чуть утоляло голод. Я решил создать 2 объекта Один как Антизомбин, но с меньшей защитой и второй наподобие батончика и после курения он как - бы всё съедал и тогда уходило-бы часть псивоздействия и голод, и как-бы от курения. Но объект kurevo не съедается. Вот как то так. Изменено 14 Февраля 2017 пользователем HellRatz Добавлено HellRatz, 14 Февраля 2017 Пользуемся спойлерами. Ссылка на комментарий
Kirgudu 1323 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 @pc-2, ты б внимательно прочёл, что именно написано в логе вылета. "attempt to index global 'sobj' (a nil value)" - скрипт не может получить свойство id переменной sobj, так как sobj ничего не содержит. Эта переменная просто не присвоена. Надо делать так: local sobj = alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) level.client_spawn_manager():add(sobj.id, -1, function(id, obj) db.actor:eat(obj) end) 1 Ссылка на комментарий
Kondr48 314 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 Как можно определить количество знаков после запятой? Допустим, передать в функцию 0.0001, чтобы вернула она 4; 0.00006 - 5 и т. д. Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) @Kondr48, костыли: function number_after_decimal_point(n) n = string.match(n, ".[0-9]+") n = string.sub(n, 2) n = string.len(n) return n end Изменено 15 Февраля 2017 пользователем Kober(BRUC) 1 Ссылка на комментарий
Kirgudu 1323 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) @Kober(BRUC), В твоём варианте number_after_decimal_point(45.54050001) = 1 @Kondr48, примерно так: function count_decimal_places(n) local r = string.match(n, "%.[0-9]*[1-9]") return r and r:len() - 1 or 0 end должно подойти для входного аргумента и в виде числа, и в виде строки. Завершающие нули (если есть в строке) не учитываются. Изменено 15 Февраля 2017 пользователем Kirgudu 1 1 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) @Kirgudu, и ещё стоит добавить, что максимальное число цифр после запятой - это десять, если число больше ста. Изменено 15 Февраля 2017 пользователем Kober(BRUC) 1 Ссылка на комментарий
Kirgudu 1323 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) @Kober(BRUC), ЕМНИП, 12. Но это для аргумента-числа. Поправка: всего 14 знаков, из которых следует вычесть число периодов (именно периодов, а не знаков, то есть единственный нуль не играет роли) до десятичной точки.А для строки ограничения нет: count_decimal_places("45.54050657156521651751257251721571257125721512521567215215454654654001") = 68 Изменено 15 Февраля 2017 пользователем Kirgudu 2 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) @Kirgudu, результат моих тестов: number(далее просто n) - аргумент функции, то есть наше число. count(далее c) - максимальное количество чисел после запятой. n < 0.1, c = 15; n < 1, c = 14; n < 10, c = 13; n < 100, c = 12; n < 1000, c = 11; Изменено 15 Февраля 2017 пользователем Kober(BRUC) 1 Ссылка на комментарий
Kirgudu 1323 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 (изменено) n < 1, c = 16; Думаю, всё-таки n < 1, c = 14; Что как раз соотносится с тем, что я написал выше. Остальное тоже не противоречит. Интересно, что если передать напрямую слишком большое число (не важно, с десятичной частью или без), где-то в недрах обработчика от фонаря добавляется точка после первого же знака: count_decimal_places(2421212105221221) = 13 а следует это отсюда: string.match(2421212105221278, "%.[0-9]*[1-9]") = ".4212121052212" Забавно. Update. А вообще, как выясняется, там не всё так просто и для моего варианта. Например: function count_decimal_places(n) local r = string.match(n, "%.[0-9]*[1-9]") return r and r:len() - 1 or 0 end count_decimal_places(.0000000045) Результаты промежуточных вычислений такие. n внутри функции: 4.5e-009 r: ".5" На выходе: 1 То есть всё портит внутреннее представление дробных чисел. Как вариант, можно самостоятельно переводить число в строку: function count_decimal_places(n) local r = string.match(string.format("%.20f", n), "%.[0-9]*[1-9]") return r and r:len() - 1 or 0 end Но при большой разнице между кол-вом знаков в форматировании и реальным число начинает искажаться, так как string.format("%.15f", 11.00045) --> "11.000450000000001" Надо признать, что мой вариант также нельзя считать применимым во всех случаях. Вот для строк он работает, а для чисел - как повезёт. Возможно, кто-нибудь сможет предложить правильное решение. Изменено 15 Февраля 2017 пользователем Kirgudu 1 1 Ссылка на комментарий
pc-2 139 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 local sobj = alife():create("kurevo", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) level.client_spawn_manager():add(sobj.id, -1, function(id, obj) db.actor:eat(obj) end) Сделал как ты сказал Expression : assertion failed Function : CInventory::EatFile : E:\stalker\sources\trunk\xr_3da\xrGame\Inventory.cppLine : 892Description : pIItem->m_pCurrentInventory==this Ссылка на комментарий
Kirgudu 1323 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 @pc-2, попробуй так: local sobj = alife():create("kurevo", vector(), 0, 0, db.actor:id()) level.client_spawn_manager():add(sobj.id, 0, function(id, obj) db.actor:eat(db.actor:object("kurevo")) end) А вообще этот механизм проверен годами, если опять не сработает, значит ты что-то не так делаешь. Ссылка на комментарий
pc-2 139 Опубликовано 15 Февраля 2017 Поделиться Опубликовано 15 Февраля 2017 local sobj = alife():create("kurevo", vector(), 0, 0, db.actor:id()) level.client_spawn_manager():add(sobj.id, 0, function(id, obj) db.actor:eat(db.actor:object("kurevo")) end) Добавил эту функцию, получился такой вот вид Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти