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

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


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
  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

  • Спасибо 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

@AndrewMor, ты б объяснил толком, что хочешь сделать.

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

@dimka02, X-Ray Extensions, функция level.get_target_dist().

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

 

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

@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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

 

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

 

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

@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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

@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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

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

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

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

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

  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

 

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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

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

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

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

  • Спасибо 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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


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

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