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

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


Svoboда

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

(изменено)

@BoBaH_671, простейший пример - сохранять название локации в pstor ГГ, а при загрузке сверять название текущей локации с сохранённым. Например:

if xr_logic.pstor_retrieve(db.actor, "lvl", "first_level") ~= level.name() then
	db.actor:give_info_portion("level_changed")
	xr_logic.pstor_store(db.actor, "lvl", level.name())
end

вместо "first_level" следует подставить название стартовой локации (для ЧН это "marsh") - тогда инфопорция будет выдана только при смене локации, но не при старте игры.

"level_changed" - название выдаваемой инфопорции.

Проверку можно повесить, например, на первый апдейт актора.

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

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


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

@Nazgool, ссылку на твой пост с переведённым руководством @Dennis_Chikin опубликовал в шапке той темы ещё в январе. Вот:

http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905371

Ну а я добавил сейчас пояснения. Так что действительно, «кто ищет...». :)

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


Ссылка на сообщение
(изменено)

@Николай1, начинание благое, жаль только припозднилось года этак на 2-3.
Но если удастся предложить что-то действительно новое и полезное - всем будет только хорошо.

Для начала рекомендую изучить аналогичные решения, уже предложенные другими авторами, коих даже больше, чем указал @Desertir.

Можно сделать общий поиск по форуму слова «event». Или поискать отдельные варианты: "Песочница" от @xStream, слот-сигнальная система от @Malandrinus, были ещё частные реализации от @Artos и, кажется, @Monnoroch и @Viнt@rь.

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

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


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

@AndrewMor, как минимум "if i==count then", чтобы не вылетало.

А во-вторых, после окончания действия цикла (перед закрывающим функцию "end") в переменной col как раз и будет нужное значение, можно делать с ним что угодно.

  • Спасибо 1

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


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

Потому что переменая i существует только внутри цикла, а вне его равна nil.

Оставь только проверку на col ~= 0.

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


Ссылка на сообщение
(изменено)

@Zander_driver, смотри свойство нет-пакета weapon_state. Если оружие заклинило, будет иметь значение 7.

Свойство есть и в стандартной, и в update-части.

Изменено пользователем Kirgudu
  • Спасибо 2

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


Ссылка на сообщение
(изменено)

@Struck, шикарный ответ. Человеку, слабо разбирающемуся в предмете, даёт исчерпывающий объём информации. Имхо, уж лучше вообще не отвечать, чем вот так.

 

@Winsor, касательно первого вопроса, как можно догадаться из названия методов, они предназначены для работы с update- и state-частями нетпакета соответственно. Общие сведения есть на форуме, например здесь.

Если же хочется понять, каким методом работать с определёнными свойствами определённого объекта, действительно, тут может помочь изучение файла acdc.pl. Но не абы какого - от «Universal ACDC» не пойдёт. Открой acdc.pl от bardak, предназначенный для нужной части игры. Там ищи таблицы upd_properties_info - для каждого объектного класса своя. В этих таблицах и описаны доступные свойства update-части нетпакета.

В качестве альтернативы можно ещё поизучать скриптовые модули нетпакетов (для m_netpk от Artos ищи таблицы up_props).

Изменено пользователем Kirgudu
  • Спасибо 3
  • Полезно 1

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


Ссылка на сообщение
(изменено)

self.storage - заспавленный на уровне объект, стою возле него, т.е. он в онлайне...

Изменение пакета возможно только для серверных объектов, находящихся в оффлайне. Иначе серверный объект постоянно обновляется данными клиентского - отсюда и несоответствие реальной и ожидаемой длин считанных из пакета в объект данных.

Кстати, какой класс у твоего объекта? Если специальный, только для хранения твоих данных, имеет смысл добавить в его биндер методы, препятствующие переходу объекта в онлайн. Примерно так:

function se_custom_storage:can_switch_online()
	return false -- никогда не выходить в онлайн
end
function se_custom_storage:can_switch_offline()
	return true -- всегда переходить в оффлайн
end

Если же один из стандартных, перед записью данных объект следует принудительно перевести в оффлайн:

function switch_offline(sobj_id)
	local sim = alife()
	if sim and sim:object(sobj_id) then
		sim:set_switch_online(sobj_id, false)
		sim:set_switch_offline(sobj_id, true)
	end
end

затем, после записи данных, перевести аналогичным образом обратно в онлайн.

 

А вообще, для хранения своих данных лучше воспользоваться полностью отлаженными решениями, которые можно найти здесь, на форуме. Навскидку можно предложить альтернативные реализации от @Malandrinus (используется, если не ошибаюсь, в OGSE) и @Artos (делаем поиск по «se_stor»).

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

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


Ссылка на сообщение
(изменено)

@Forser, будет. И даже целых два, как и в первом варианте.

Во-первых, то, что за пределами функции, выполнится уже при инициализации модуля (если, конечно, не заключено в ещё большую внешнюю функцию). А значит попытается присвоить значение переменной slot_s, которая в случае отсутствия чего-либо в слоте станет равной nil. И следующим действием ты сразу пытаешься взять секцию, что с slot_s = nil даст немедленный вылет.

А во-вторых, уже actor:item_in_slot(n_s) при начальном выполнении даст, скорее всего, вылет, так как переменная n_s ещё не инициализирована.

 

Вот вариант:

local get_slot_section = function(n_s)
  local item = db.actor and db.actor:item_in_slot(n_s)
  return item and item:section()
end

function test()
  local section = get_slot_section(номер_слота)
  if section == "предмет" then
    ...
  end
end
Изменено пользователем Kirgudu
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

@Карлан, не-не, я уже одной ногой в отпуске, на 2 недели оставляю раздел на тебя и остальных дровосеков. ;)

 

Но перед уходом на правах модератора призываю всех участников темы к постам по существу, без перекидывания топорами и личных выпадов!

 

+: dc или кто-нибудь ещё из ответственных, этот мой пост и всё лишнее выше под снос, плз, когда сочтёте нужным.

Изменено пользователем Kirgudu
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

@Winsor, ну а кто мешает сократить этот список так, чтобы он содержал только сталкеров? Точнее, добавить ещё один.

Могу сказать про ЧН, но в ТЧ должно быть что-то аналогичное. В ЧН объекты добавляются в db функцией db.add_obj(), которая вызывается из motivator_binder:net_spawn(sobject).
Надо всего лишь добавить в db ещё одну таблицу (например, db.stalkers), а в add_obj добавить проверку isStalker() и если она вернёт true - вставлять запись в новую таблицу (и в общую по-прежнему тоже).

Таким образом сокращение размера выборки произойдёт уже на стадии загрузки (и/или спавна нового объекта), то есть заранее.
А потом в функции, которую привёл выше @naxac, делать перебор по этой таблице, а не по общей.

Изменено пользователем Kirgudu
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

Только надо не забыть добавить как вставку в эти таблицы, так и удаление из них (опять же по аналогии с имеющимся функционалом для общей таблицы) - чтобы в этих таблицах не накапливались несуществующие объекты.

Изменено пользователем Kirgudu
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

@Zander_driver

weapon_flags - оружие спрятано/взято в руки (0/1).

weapon_zoom - режим обычный/прицеливание (0/1).

num_items - точно не скажу, но вроде бы от значения этого параметра зависит дальнейший состав нет-пакета. То есть если там 0 - дальше следуют как раз оружейные параметры. Если не 0 - перед оружейными параметрами идёт ещё update-часть от cse_alife_inventory_item.

Как-то так.

 

Upd: насчёт доп. свойств нет-пакета при num_items ~= 0 были упоминания пару лет назад, например здесь: http://www.amk-team.ru/forum/index.php?showtopic=6185&p=727594

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

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


Ссылка на сообщение
(изменено)

@Wlad777, например так:

local client_objects_array = {} -- массив клиентских объектов, расстояние до которых нужно проверить.
function check_distance()
  for _,object in pairs(client_objects_array) do
    if db.actor:position():distance_to(object:position()) < 100 then return true
  end
  return false
end
Вернёт true при любом объекте из массива, находящемся ближе 100 метров.

Мерить расстояние до самого ближнего объекта не имеет смысла, так как если дальний объект укладывается в нужное расстояние, то и ближний - автоматически тоже.

Изменено пользователем Kirgudu
  • Полезно 1

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


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

А как мне этот массив получить то сначала?

Вот заспавнены у меня на уровне, в разных местах, скажем 15 объектов секции [safemarker].

Это уже зависит от задач и окружения.

Можно перебрать все онлайновые объекты в db.storage, получить их секцию и сравнить с нужной.

Можно вообще все серверные объекты перебрать (alife():object(i), где i = от 1 до 65534), только позицию у таких объектов надо будет брать не методом position(), а в свойстве .position.

Но это затратные способы. Лучше организовать свою таблицу для таких объектов - такой вариант обсуждался здесь несколько страниц назад.

А вообще, в скриптах примеров навалом.

  • Полезно 1

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


Ссылка на сообщение
(изменено)

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

 

Как программисту мне твоё нововведение нравится: условия в фигурных скобочках объединяются по "and", фигурные скобочки между собой по "or". Правильно я понял? Как пользователю, который пишет и читает логику, не нравится. Нечеткость не однострочной формы, а то что фигурных скобочек станет несколько - непонятно, то ли пропустили секцию, то ли так и хотели.

Можно для «or» использовать не пробел, а ввести дополнительный разделитель (чтобы было проще читать - вообще неиспользуемый в логике в настоящее время символ, можно с опциональными пробелами вокруг него), который однозначно будет указывать на новый тип конструкции.

Те пользователи, которые привыкли писать по-старому и не хотят разбираться с новыми возможностями (как вариант - вообще не в курсе этих возможностей), так и продолжат писать по-старому. А кто захочет - будет использовать, наперёд зная, что означает данное написание.

Изменено пользователем Kirgudu
  • Согласен 2

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


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

Никогда не был силён в регулярных выражениях.
Требуется из строки вида, например, «aaa_bbb_ccc_ddd» вытащить подстроку от первого символа и до последнего подчёркивания включительно, то есть «aaa_bbb_ccc_», и присвоить это значение переменной средствами сталкеровского Lua. В строке могут быть буквы, цифры и подчёркивания, больше никаких знаков, регистр любой.
Может кто-нибудь помочь?

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


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

@Romz, пробежался глазами, вроде всё правильно.

Единственное, что смутило, это

packet:w_begin(0)
packet:r_seek(2)
p_obj:STATE_Write(packet)
Я бы STATE_Write и r_seek поменял местами, сделав установку позиции чтения после записи в пакет, а не до. Вдруг эта позиция при записи может смещаться.

Ну и непонятно, какие аргументы передаёшь ты в функцию извне.

  • Спасибо 1

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


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

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

AMK-Team.ru

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