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

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


Svoboда

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

Начинающего ковыряльщика может интересовать вовсе даже не ТЧ, а, скажем, ЧН, как меня 9 лет назад, или ЗП. :)

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


Ссылка на сообщение
19 часов назад, Norman Eisenherz сказал:

Работает ли метод iterate_inventory_box(func, obj) в ЧН?

Работает. Применяется, например, в моде OGSM CS 1.8 CE Fixes для переноса вещей из ящика в инвентарь актора после миниигры со стрельбой. Насколько мне известно, работает без ошибок.

  • Нравится 1
  • Согласен 1

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


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

Вот чтобы не "убились", и надо задействовать кастом дату. :) В описанном случае никаких неприятных последствий замечено не было.

  • Спасибо 1
  • Согласен 2

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


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

@Zander_driver, я имел в виду несколько другое. Если выбирать между записью в кастом дату и в отдельное свойство всего нет-пакета [ local data = pk:get()    data.my_prop = 1    pk:set(data) ] - однозначно следует предпочесть кастом дату, поскольку добавление отдельного свойства может поломать весь нет-пакет, обладающий определённой структурой для каждого типа объекта (хотя не исключено, что модуль просто проигнорирует добавленные свойства, не характерные для нет-пакета - это я не проверял).

Ну а то, что мы не можем превышать определённую длину, обсуждалось уже много раз. Впрочем, согласен, упомянуть об этом стоило. :)

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

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


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

@Norman Eisenherz, достаточно определить, что командир отряда стал враждебным, ведь метка отряда вешается на него.
См. commander:general_goodwill(db.actor) в модуле sim_squad_generic.script (commander определяется там же) и дальнейшее использование этого показателя. При определённых его значениях можно вызывать self:hide() / self:show(), что приведёт к нужному результату.

Изменено пользователем Kirgudu
была ошибка в названии метода

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


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

@UriZzz у тебя и подсказка в логе есть

args=[string]~not_table!

и пример в конце модуля

start_game_timer(3*60, nil, {info_id = "my_infoportion"})

Грубо говоря, ты в качестве доп. аргумента передаёшь строку "UriZzz_test.mecheny_mail", а надо таблицу. То есть:

start_game_timer(30*60, nil, {param1 = "UriZzz_test.mecheny_mail"}) -- аргумент - таблица

Если же ты хотел вызвать функцию внешнего модуля (на что слегка намекает текст "UriZzz_test.mecheny_mail"), то для этого надо было воспользоваться вторым аргументом, который у тебя сейчас равен nil, и без кавычек. А именно:

start_game_timer(30*60, UriZzz_test.mecheny_mail) -- аргумент - указатель на функцию внешнего модуля

В общем, смотри внимательно примеры в конце модуля таймеров, там всё расписано.

  • Спасибо 1
  • Согласен 1
  • Полезно 2

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


Ссылка на сообщение
45 минут назад, Colder сказал(а):

Подскажите функцию

for k,v in pairs(бла) do

  if v == true then db.actor:give_game_news('бла-бла', 'бла-бла-бла', "ui_iconsTotal_PDA", 0, 3000) end

end

 

P.S.: задавай свои вопросы в человекопонятной форме.

  • Спасибо 1
  • Согласен 2

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


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

@h0N0r все перечисленные методы действительно клиентские, а в переменной obj у тебя серверный объект. Если хочешь получить клиентский, следует действовать например так:
  local cobj = level.object_by_id(obj.id)

  if cobj then ... end
и далее по написанному. Однако зачем делать это после удаления, если я правильно тебя понял? Ты уж определись, что необходимо - удалить объект или придать ему ускорение.

  • Нравится 1
  • Полезно 1
  • Смешно 1

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


Ссылка на сообщение
54 минуты назад, ted.80 сказал(а):

Что-то ме подсказывает что id тут лишнее попробуй так

Не надо так делать, в том варианте должно быть именно sobj.id.

А так гейм вертекс можно (и нужно в данном случае) получать уже из серверного объекта:

local sobj = alife():object(i)
if sobj and sobj.m_game_vertex_id == 2482 and IsStalker(sobj) and sobj:alive() then
    return true
end

И ещё: почему только 2482? Других вертексов на нужной локации нет?
Имхо, лучше из гейм вертекса получать id локации и проверять уже его совпадение с нужным:

function get_level_nps()
	local al, gg = alife(), game_graph() -- многократно используемые функции кешируем для производительности
	for i=1,65535 do
		local sobj = al:object(i)
		if sobj and gg:vertex(sobj.m_game_vertex_id):level_id() == XXX and IsStalker(sobj) and sobj:alive() then -- вместо XXX подставить Id локации (не путать с наименованием)
			return true
		end
	end
	return false
end

Или, чтобы не вызывать лишние функции, сравнивать sobj.m_game_vertex_id с диапазоном значений - больше одного и меньше другого:

if sobj and sobj.m_game_vertex_id >= XXX and sobj.m_game_vertex_id <= YYY and IsStalker(sobj) and sobj:alive() then -- вместо XXX и YYY подставить граничные гейм вертексы локации
	return true
end

 

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

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


Ссылка на сообщение
5 часов назад, Капрал Хикс сказал(а):

Почему-то повторяются функции function add_obj( obj ) и function del_obj( obj ) и мне это кажется странным. Такое вообще допустимо?

Как ни странно, да. Примеры двойного объявления одних и тех же функций встречаются даже в скриптах оригинала (хотя, может быть, это-то как раз и не странно). Если кому интересно - загляните в чистонебовский скрипт task_objects.script, функция CHideFromSurgeTask:check_task(). Там внутри есть две встроенные функции, описанные дважды в пределах одного пространства.

На практике, если представить, что содержимое повторяющихся функций различно, работать будет та, которая объявлена второй (третьей, четвёртой и так далее).

Что конкретно должно быть в примере выше, сказать не могу. Всё зависит от логики, которую хотелось вложить в код автору. Возможно, заполняться должна только таблица creatures, возможно - creature, а возможно и обе сразу. Надо изучать те скрипты, где они используются далее.

Но я предлагаю критически взглянуть на другое место. Вот:

function add_obj( obj )
    -- ... <skip> ...

    if IsStalker(obj) and IsMonster(obj) then --> если И сталкер И монстр
        btr_target[obj:id()] = true
    end
end

Ничего не смущает?

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


Ссылка на сообщение
11 часов назад, AndrewMor сказал:

Вообще-то, это тема по ТЧ, если что.

С каких пор? Может, уже появились альтернативные темы по всем трём платформам, а народ-то и не в курсе?

Тема по ТЧ - это "[SoC] Ковыряемся в файлах" или, например, "[SOC] Мелкие правки движка". "Скриптование" же всегда было мультиплатформенной темой, не надо искусственно навязывать лишние рамки.

 

@Norman Eisenherz но тема всё равно вряд ли правильная, с таким вопросом, имхо, надо идти к тем, кто ковыряет движок.

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

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


Ссылка на сообщение
25 минут назад, INNOCENT KILLAZ сказал:

они одноразовые или нет

Нет, конечно. :) Это точки постоянного (на протяжении игры) периодического (раз в какое-то время) спавна в указанной точке указанной группы монстров с контролем максимальной численности.

25 минут назад, INNOCENT KILLAZ сказал:

что дает "fake"

См. в функции ogsm_packet.spawn_monster. В зависимости от значения в этом параметре ("fake"/"random_fake"/прочее) монстру назначается та или иная кастомная логика поведения.

 

На будущее, подобные вопросы больше подходят для одной из тем "Ковыряемся в файлах" (в данном случае, я так подозреваю, вариация для ЧН).

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

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


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

@INNOCENT KILLAZ да, фриплей тут ничем концептуально не отличается. Однако набор и наполнение точек могут меняться на разных стадиях игры, в том числе при наступлении фриплея - см. для подробностей код модуля ogsm_respawn. Там есть проверки по выданным инфопорциям и в зависимости от этого разные наборы спавна.

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

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


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

@Colder конечно, если вместо случайной выборки одной строки воспользоваться, например, циклом и вернуть по итогу таблицу (не забыть обработать её на выходе отличным от пары значений образом):

Скрытый текст

 

--local key = math.random(0,n-1)
--local result, item, num = ini:r_line("generic_list",key,"","")
--alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
--return item, num

local t = {}
for key = 0,n-1 do
  local result, item, num = ini:r_line("generic_list",key,"","")
  alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  table.insert(t, { item = item, num = num })
end
return t

 

Так будут обработаны все строки из generic_list.

При желании сюда же можно прикрутить случайную выборку нескольких строк и так далее. Простор для творчества не ограничен.

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

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


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

По мотивам всего вышенаписанного.

06.07.2022 в 10:28, HellRatz сказал:

shape0:axis_x = 2.64159965515137,0,0 --ширина зоны по X
shape0:axis_y = 0,2.22759985923767,0 --ширина зоны по Y
shape0:axis_z = 0,0,2.64159965515137 --ширина зоны по Z
shape0:offset = 0,0,0 --поворот по осям (x,y,z)

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

 

@Zander_driver, респект.

  • Спасибо 1
  • Нравится 1
  • Согласен 1

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


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

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