Перейти к контенту

Рекомендуемые сообщения

@dsh, для меня 300 мс это фриз и он мне не нужен, я же выше написал что отмел сякоуборщик, прежде чем думать о чем-то своем я брал что там под руку попадалось и замерял, но с такими фризами мне это не надо (по крайней мере сейчас). Зачем перебирать все объекты там, где можно обойтись и без этого?

Ссылка на комментарий

Т.е. 0.3 секунды. Ну и смысл тут что-то усложнять и куда-то размазывать?

О, не скажи ! Как раз "размазывание" позволяет превратить эти 0.3 секунды в 3. Или в 30.

  • Согласен 1
Ссылка на комментарий

"Если оно создавалось, чтобы игрок его увидел, то подумать: а как, собственно, он это сможет увидеть ?"

Да это понятно, Меня больше принципиальный подход интересует, что и зачем чистить каждый сам решает.

Ссылка на комментарий

Вот это и есть тот самый принципиальный принцип: набить тыщщу профилей неписей, каждый с гранатами 5 видов, а потом гранатометательный скрипт их удаляет при входе в онлайн, и в ходе в офлайн, и еще в апдейте в 20-70 ms проверяет, а не прошла ли секунда с того момента, как что-то удалялось или создавалось, и создает/удаляет что-то еще.

 

Особенно круто, когда такое пытаются сделать ТРИ скрипта одновременно, а четвертый удаляет оружие, которое 2-й назначил парентом гранаты, удаляемой третьим. ;)

 

 

Ну а до кода - ну вот я тебе клинер не-сяковский давал. Вообще совсем не сяковский.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

 

 

для меня 300 мс это фриз

 

Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик.

Ссылка на комментарий

 

 

Какой еще фриз? Уборщик работает в net_spawn-е актора и на фоне времени, затрачиваемого на выход в онлайн всех текстур, моделей и звуков - это пшик.

300 мс это весьма ощутимый фриз, доложу я тебе, и увеличивать время загрузки мне совсем не хочется. Так как да, потом дойдет и до 3, и до 30. Сравнение странное, как-будто ты грузишь либо текстуры, либо модели, в общем что-то одно.

Ссылка на комментарий

@Карлан, Я вот тебя не понимаю, об чём эти цыфери?

Не устраивает имеющийся в движке массив объектов? И ты решил свой собственный заделать на луа, занося-вынося туда десятки тысяч объектов, ради какого высшего блага?


Подарки

  • Ссылка на комментарий

    Всем привет, объясню суть проблемы. Создаю новый предмет - копирую сецию премета напр. 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")) не срабатывает. В чём может быть проблема?
    Зараннее спасибо.
    Изменено пользователем pc-2
    Добавлено  HellRatz,

    В теме "Уроков" в шапке красным по белому написано для чего та тема. Устное предупреждение. Перемещено куда полагается.

    Ссылка на комментарий

    @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
    • Спасибо 1
    Ссылка на комментарий

    @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 не съедается. Вот как то так.
    Изменено пользователем HellRatz
    Добавлено  HellRatz,

    Пользуемся спойлерами.

    Ссылка на комментарий

    @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
    Ссылка на комментарий

    Как можно определить количество знаков после запятой? Допустим, передать в функцию 0.0001, чтобы вернула она 4; 0.00006 - 5 и т. д.

    Ссылка на комментарий

    @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

    Изменено пользователем Kober(BRUC)
    • Спасибо 1
    Ссылка на комментарий

    @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
    
    

    должно подойти для входного аргумента и в виде числа, и в виде строки.

    Завершающие нули (если есть в строке) не учитываются.

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Нравится 1
    Ссылка на комментарий
    @Kirgudu, и ещё стоит добавить, что максимальное число цифр после запятой - это десять, если число больше ста. Изменено пользователем Kober(BRUC)
    • Спасибо 1
    Ссылка на комментарий

    @Kober(BRUC), ЕМНИП, 12. Но это для аргумента-числа.

    Поправка: всего 14 знаков, из которых следует вычесть число периодов (именно периодов, а не знаков, то есть единственный нуль не играет роли) до десятичной точки.
    А для строки ограничения нет:

    count_decimal_places("45.54050657156521651751257251721571257125721512521567215215454654654001") = 68
    
    Изменено пользователем Kirgudu
    • Полезно 2
    Ссылка на комментарий

    @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;

    Изменено пользователем Kober(BRUC)
    • Полезно 1
    Ссылка на комментарий
    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"
    

    Надо признать, что мой вариант также нельзя считать применимым во всех случаях. Вот для строк он работает, а для чисел - как повезёт.

     

    Возможно, кто-нибудь сможет предложить правильное решение.

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Нравится 1
    Ссылка на комментарий

     

     

    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::Eat
    File : E:\stalker\sources\trunk\xr_3da\xrGame\Inventory.cpp
    Line : 892
    Description : pIItem->m_pCurrentInventory==this

     

    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

      Ни один зарегистрированный пользователь не просматривает эту страницу.

    AMK-Team.ru

    ×
    ×
    • Создать...