Карлан 1 049 Опубликовано 12 Февраля 2017 Поделиться Опубликовано 12 Февраля 2017 "Если оно создавалось, чтобы игрок его увидел, то подумать: а как, собственно, он это сможет увидеть ?" Да это понятно, Меня больше принципиальный подход интересует, что и зачем чистить каждый сам решает. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 12 Февраля 2017 Поделиться Опубликовано 12 Февраля 2017 (изменено) Вот это и есть тот самый принципиальный принцип: набить тыщщу профилей неписей, каждый с гранатами 5 видов, а потом гранатометательный скрипт их удаляет при входе в онлайн, и в ходе в офлайн, и еще в апдейте в 20-70 ms проверяет, а не прошла ли секунда с того момента, как что-то удалялось или создавалось, и создает/удаляет что-то еще. Особенно круто, когда такое пытаются сделать ТРИ скрипта одновременно, а четвертый удаляет оружие, которое 2-й назначил парентом гранаты, удаляемой третьим. Ну а до кода - ну вот я тебе клинер не-сяковский давал. Вообще совсем не сяковский. Изменено 12 Февраля 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
dsh 3 824 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 для меня 300 мс это фриз Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Карлан 1 049 Опубликовано 13 Февраля 2017 Поделиться Опубликовано 13 Февраля 2017 Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик. 300 мс это весьма ощутимый фриз, доложу я тебе, и увеличивать время загрузки мне совсем не хочется. Так как да, потом дойдет и до 3, и до 30. Сравнение странное, как-будто ты грузишь либо текстуры, либо модели, в общем что-то одно. Ссылка на комментарий
Bak 755 Опубликовано 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 3 824 Опубликовано 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 ) dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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) Добавил эту функцию, получился такой вот вид Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти