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

Скриптование


Svoboда

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

Так это нужно прописывать не в update, а в функцию, вызываемую при попадании (hit_callback). Тогда никаих лишних переменных вводить не придётся.

Для ГГ в оригиналах hit_callback не вызывается

Поделиться этим сообщением


Ссылка на сообщение

*Shoker*, Real Wolf,

custom_data = <<END

нет у вертолета логики :) вот он и гудит где-то

Поделиться этим сообщением


Ссылка на сообщение
Нижеследующие параметры есть только у дробовиков и ружей

8) upd:ammo_ids

Количество оставшихся патронов в стволе. Полностью дублирует upd:ammo_elapsed, зачем - непонятно.

Вообще-то не дублирует. После этого параметра должны прописываться типы заряженной дроби в количестве upd:ammo_ids

Типа можно дробовик зарядить дробью, жеканом и т. п. одновременно

 

4) upd:ammo_type

Тип патронов. 0 - обычные, 1 - бронебойные. Если есть еще - идут в порядке повышения убойности (так вроде)

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

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение
abramcumner, ammo_ids всегда равен ammo_elapsed. Проверял для всех дробовиков, с разными типами патронов, с разным количеством патронов разных типов. Так в ТЧ, по крайней мере.

Он и должен быть равен ammo_elapsed, просто он задает размер массива идущего следом. Дальше идет массив байт - определяет тип заряженных патронов.

Поделиться этим сообщением


Ссылка на сообщение

serega-gamer,

количество патронов в инвентаре для оружия получаешь так же, как и в своем коде выше, только используешь функцию get_ammo_total вместо get_ammo_in_magazine

 

Дельный совет!!! --/ Artos

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
Надо понимать, что если таких мест становится слишком много, то контролировать их все становится просто невозможно, поэтому подход с хранением id является универсальным.

С таким же ид может быть уже совсем другой объект. Лучше чистить :)

Можно подумать над апгрейдом db.storage. Везде использовать ссылку на объект из него, а в нем ссылку на клиентский объект обнулять по нет_дестрой. А дальше и над заменой lua_help`ных функций, чтобы они возвращали не клиентский объект, а спец объект. :crazy: Потом использовать Null object, чтобы убрать проверки на существование объекта :rofl2: Но это уже будет в сталкер2

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение
а вот Null Object pattern - вещь более чем сомнительная, поскольку может (и с гарантией будет) скрывать ошибки и вместо повышения надёжности в итоге приведёт к появлению неуловимых и неотлаживаемых багов.

Добавить в дебаге логирование и вывод стека при обращении к такому объекту, можно и аборт добавить.

 

Вот здесь бы пригодился сборник этаких "шаблонов", т.е. типичных подходов для серверных, клиентских объектов разного типа и где и как это делать.

Если скрипты пишет один человек - достаточно небольшой дисциплины. Несколько - нужен аборт, чтобы сразу по рукам бил. Это как с mark_item_dropped; хорошая задумка оказалась совершенно не нужной, потому что использовалась/ется не всеми.

Поделиться этим сообщением


Ссылка на сообщение

AndreySol,

Потому что проблема с сидом совершенно в другом: сид не находится в реестре сидов. А не находится, потому что задаешь его после регистрации

Перехвати событие on_before_register и установи сид там.

Если используешь последние наработки с событиями, то сделать это просто.

 

Ну или переключить онлайн/оффлайн.

Поделиться этим сообщением


Ссылка на сообщение
К сожалению, ничего из указанного не поможет. SID не пропишется в глобальный список до следующей загрузки игры или перехода на другой уровень.

Вообще-то способ с прописыванием сида в on_before_register давно и успешно у меня работает. Попробуй на досуге. Собственно on_before_register не зря так назван. Метод вызывается, как раз до прописывания в глобальный список :)

 

Добавлено через 3 мин.:

Что есть "реестре сидов" ? Имеется в виду game_story_ids.ltx ?

Реестр сидов (malandrinus его назвал глобальный список) - список всех зарегистрированых сидов в игре. Хранится в движке. Если в понятиях луа, то таблица, ключ которой сид, значение серверный объект.

Поделиться этим сообщением


Ссылка на сообщение
Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ?

m_story_id - свойство только для чтения. Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register

Поделиться этим сообщением


Ссылка на сообщение

AndreySol,

function se_stalker:on_before_register()
    local ser_obj = alife():object(self.id)

se_stalker -это же и есть тот серверный объект, который ты получаешь:) смело используй self вместо ser_obj.

Ну и как правильно заметил, в on_before_register объект еще не зарегистрирован.

 

Кстати такой код всем подряд будет писать сид 93. Лучше уж перед alife():create установи глобальный флажок в 93, в on_before_register проверь флажок на нил,установи сид и флажок в nil.

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение

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

Фризы то хоть уменьшились?

 

при отказе от классов протестируй еще такой вариант:

for i = 1, 1000000 do
local n = b.num
end

Без функций вообще все летать будет. :ny_megalol:

 

Ты кстати, проверил, что фризы из-за скриптов, если из-за скриптов, то именно из-за net_spawn? А то я недавно читал, что у кого-то фризы из-за моделей были. И при выходе в онлайн не только net_spawn вызывается.

Время выполнения инициализации звуков я так понимаю ты замерил? Напиши цифирки, сколько функция выполняется и сколько весь net_spawn.

Поделиться этим сообщением


Ссылка на сообщение

метод net_spawn выполняется достаточно быстро, но фризы ощутимы. В общем, копаю дальше...

Начни с того, что отключи биндер у НПЦ, проверь фризы. Если исчезнут, значит дело в скриптах. Дальше замеряешь методы биндера reinit, load, reload, net_spawn, первое выполнение апдейта. Смотришь тайминги.

 

А отказ от классов - это уже тяжелая артиллерия, если совсем не найдешь причину фризов.

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение

local item = db.actor:active_item()

local vX, vY = get_all_direction(item:direction())

vY у тебя всегда должен быть равен 0, 1, 0. Хотя скорее -1 :)

 

В принципе теперь я могу доделать то, что планировал :)

Лучше расскажи, что ты планировал, а то пока непонятно даже, что ты хочешь.

 

Однако в данной функции есть один недостаток - она не учитывает Roll (наклон объекта вбок)

Ну да, ты указываешь, что верх у тебя вверху (0, 1, 0) :)

 

Если пользуешься xray-extensions можно попробовать получать оси из xform, например.

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение

Shoker,

Какой такой наклон у объектов? Где ты это видел? А если это ГГ, то зачем тебе эти пляски, если можно не заморачиваясь взять уже готовую камеру?

Он же привел в пример калаш. Явно у него и наклон должен быть. Его в руках крутят, как хотят.

Поделиться этим сообщением


Ссылка на сообщение

@*Shoker*,

менять дирекцию с большой скоростью - это по русски крутить? :) В теории можно приложить 2 антиколлинеарные силы к противоположным точкам тела - оно начнет крутиться на  месте :) Будет ли работать это в ОДЕ - не знаю.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

Вы запрашиваете значение элемента таблицы V

Но для всех полей Вашей таблицы значение V равно nil (Т.е. ключ - это строка с именем инфопорции, а значенее-то nil!!!!!!!!)

Не-не. Таблица вида

local rnd_tbl = {
	"Mutant_boar_info",
	"Flesh_info",
	"Pseudo_flesh_info",
	"Bloodsucker_info",
эквивалентна таблице

local rnd_tbl = {
	[1] = "Mutant_boar_info",
	[2] = "Flesh_info",
	[3] = "Pseudo_flesh_info",
	[4] = "Bloodsucker_info",
Ошибка в том, что при итерировании таблицы, таблица меняется(table.insert). Так делать просто нельзя.

 

Ну и код сам по себе напрочь бестолковый.

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение

Вроде одно время мелькало сообщение, что где то нашли функцию-замену в одном из UI-классов или типа того.

Где-то :) Malandrinus добавил в xray-extensions. Просто функция с подходощей сигнатурой нашлась в "одном из UI-классов".

 

Ну или вообще какие есть более\менее адекватные варианты чтобы определить что в данный момент у игрока не открыта никакая UI-менюшках

В actor_menu.script отслеживаются движковые окна. В скриптовые окна добавить при показе установку флажка, при закрытии сброс.

 

Нашёл этот пост (в прошлый раз не так поиском воспользовался), он закрывает вопросы по[/size] level.main_input_receiver(), но всё ещё остаётся вопрос о том как универсальным методом определить что открыто любое UI-окно. (без правок движка)

Совершенно не закрывает :) С окном, выведенным этим методом, невозможно никакое взаимодействие игрока. Это только для показа информации и все.
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin,

странный вопрос. Зачем до него "добираться", вот же он. Прибить вестимо как: alife():release(server_object.id), правда так лучше не делать - на следующем апдейте там удалить.

Изменено пользователем abramcumner

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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