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

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

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

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

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

Вот это и есть тот самый принципиальный принцип: набить тыщщу профилей неписей, каждый с гранатами 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
Ссылка на комментарий

@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

 

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

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

А вообще этот механизм проверен годами, если опять не сработает, значит ты что-то не так делаешь.

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

 

 

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)
Добавил эту функцию, получился такой вот вид
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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