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

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


Svoboда

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

(изменено)

Левел и гейм вертиксы всех локаций

Это не все доступные левел-вертексы. Как ты их считал? По граф-поинтам (гейм-вертексам)? Так вот, это только вертексы граф-поинтов. Берешь самый большой из них для нужной локации, потом через math.random(1, <самый большой вертекс>) получаешь случайный вертекс, затем через level.vertex_position получаешь его координаты, а потом ищешь ближайший к этим координатам гейм-вертекс. Посмотри скрипты спавна динамических аномалий из того же АМК. Изменено пользователем naxac
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

Если мы указываем позицию, то можно любой левел и гейм вертекс левела указать?

Этого не знаю, надо у двигоправов спрашивать, что там к чему. Возможно, вертексы при спавне нужны для Ai.

  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

Как считывать параметр из секции? ... Мне нужно открыть конкретный файл.

local ini = ini_file("конкретный\\файл.ltx")

return ini:r_string("section", "line")

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@advisor890, попробуй так

local snd = xr_sound_soc.get_safe_sound_object("путь_до_звука")

function anomaly_detector(anomaly)
  if anomaly.tim_beep == nil then anomaly.tim_beep = 0 return end

  local dist = db.actor:position():distance_to_sqr(anomaly:position())
  if dist < 200 and math.max(dist, 50) < time_global() - anomaly.tim_beep then
    if not snd:playing() then
      anomaly.tim_beep = time_global()
      snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 1.0)
    end
  end
end

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@FonSwong, а не проще позицию получать непосредственно из объекта?

local pos = smart.position

фунуция level.vertex_position возвращает позицию вертекса на текущей локации. Зависает, т.к., видимо, передаваемого в нее вертекса нет на уровне.

 

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

в какой момент начинается заполнение пакета

В пстор при старте таймера пишется три перменных. Вот здесь они чистятся:

 

amk.del_variable("rt"..i)

amk.del_variable("rt"..i.."d")

amk.del_variable("rt"..i.."p")

amk.del_variable("gt"..i)

amk.del_variable("gt"..i.."d")

amk.del_variable("gt"..i.."p")

 

 

rt* - реального времени, gt* - игрового.

  • Спасибо 2

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@CRAZY_STALKER666, 1. Если ты имеешь в виду пояс, то пояс - это не слот, и номера у него нет. А активировать артефакт можно из первого или второго слота. Может, и из других тоже.

2. actor:transfer_item(item, box)

где item - предмет, box - ящик. Например так

 

function transfer_all_to_box()
  local box = level_object_by_sid(12345) -- 12345 - стори-ид ящика
  db.actor:iterate_inventory(function (actor, item)
    actor:transfer_item(item, box)
  end,
  db.actor)
end
  • Нравится 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@CRAZY_STALKER666, если мне склероз не изменяет, то:

Надо заспавнить в инвентарь предмет и потом перебирать инвентарь через iterate_inventory. Предметы, которые будут передаваться в итератор после заспавненного, будут либо в слотах, либо на поясе. Проверяешь их - если не в слоте, значит на поясе. Далее сверяешь то, что получилось с тем, что было на предыдущей проверке. В солянке, по крайней мере, используется такой метод - файл inventory.script. Единственное - именно момент перемещения предмета на пояс не отловить.

А в проекте X-Ray Extensions добавлены каллбэки для актера на перемещение предметов между слотами, рюкзаком и поясом.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@Kober(BRUC), наверно, ты хотел написать ini_file, а не system_ini?

Возвратит как одно значение, т.е. все, что там написано:

"One", "Two", "Three"

Если нужен массив, то разбивай строку по запятым, обрезая пробелы, через string.gfind или string.gmatch. Готовые функции для этого видел где-то в "Сборочном цехе" Изменено пользователем naxac
  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@losiara, если тебе нужно помирить их только на время одной сцены, то используй оверрайды в логике (combat_ignore и т.п.).

Или можно зомбированным сталкерам сделать отдельную секцию, в которой прописать в species вместо human - zombie.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


Ссылка на сообщение
@KURT2013, урок вполне рабочий. Если все сделать по нему, то ГГ в принципе не сможет сам по себе или случайно засыпать, т.к. сон включается только через GUI.
  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@HellRatz, из X-Ray Extensions:

level.send_event_key_press(dik) - нажатие

level.send_event_key_release(dik) - отпускание

level.send_event_key_hold(dik) - удержание

dik - код клавиши из DIK_keys.

 

@Х_и_м_и_к, если надо просто прибавить здоровья, то нужно сначала получить game_object непися, а потом добавить ему хп. Например, по story_id.

local npc = level_object_by_sid(12345)
if npc then npc.health = 1 end
Изменено пользователем naxac
  • Спасибо 2
  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


Ссылка на сообщение
(изменено)
@losiara, можно по имени в алл.спавне найти. Если по профилю, то перебирать всех онлайновых нпс и проверять у каждого character_name. Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@MegaStalker,

self.chtime=time_global()+2000

это интервал между проверками, чтобы не проверять на каждом апдейте: 2 секунды.

Данные о зомбированных хранятся в таблице "zombies", в псторе актера.

amk.mylog() - это просто вывод в лог для отладки.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@MegaStalker, придется.

load_table/save_table - функции для сохранения/загрузки таблиц из пстора

read_stalker_params/write_stalker_params - для чтения/записи нет-пакета нпс.

Для нет-пакетов я бы рекомендовал что-нибудь другое использовать, не из АМК, т.к. там местами неверно пакет читается/пишется. Модуль m_netpk от Артоса например.

А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

А чем плох этот вариант? И какие бывают альтернативы?

Слишком он тормозной, мне кажется, особенно для использования на апдейте.

Альтернативы - например, сохранение напрямую, без паковки

function save_pstor_table(pk, tbl, obj)
	local tp
	for k, v in pairs(tbl) do
		if v == true then
			pk:w_u8(pstor_true)
		elseif v == false then
			pk:w_u8(pstor_false)
		else
			tp = type(v)
			if tp == "number" then
				pk:w_u8(pstor_number)
				pk:w_float(v)
			elseif tp == "string" then
				pk:w_u8(pstor_string)
				pk:w_stringZ(v)
			elseif tp == "table" then
				pk:w_u8(pstor_table)
				xr_logic.save_pstor_table(pk, v, obj)
			elseif tp == "userdata" then
				pk:w_u8(pstor_custom)
				pk:w_stringZ(v.classname == k and "" or v.classname)
				v:save(pk)
			else
				abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]",
					obj:name(), tv, k, utils.to_str(v))
			end
		end
		pk:w_stringZ(k)
	end
	pk:w_u8(pstor_end_table)
end

function load_pstor_table(pk, tbl, obj)
	local k, v, n
	while true do
		n = pk:r_u8()
		if n == pstor_end_table then
			return tbl
		else
			if n == pstor_true then
				v = true
			elseif n == pstor_false then
				v = false
			elseif n == pstor_number then
				v = pk:r_float()
			elseif n == pstor_string then
				v = pk:r_stringZ()
			elseif n == pstor_table then
				v = {}
				xr_logic.load_pstor_table(pk, v, obj)
			elseif n == pstor_custom then
				local cls = reader:r_stringZ()
				if cls == "" then cls = k end
				v = pstor_custom_impl[cls]()
				v:load(pk)
			else
				abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name())
				v = nil
			end
			k = pk:r_stringZ()
			tbl[k] = v
		end
	end
end

function pstor_save_all(obj, packet)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	save_pstor_table(packet, pstor, obj)
end

function pstor_load_all(obj, reader)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	if (not db.actor) and npc_id ~= 0 then
		abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script")
	end
	load_pstor_table(reader, pstor, obj)
end

 

  • Нравится 2

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

@MegaStalker, ты меня не понял. Я привел пример, как переписать сохранение пстора в xr_logic.script для возможности хранения таблиц. Читать нетпакет этими функциями нельзя, как нельзя и сохранять таблицы напрямую.

 

if (self.chtime or 0) < time_global() then
        self.chtime=time_global()+2000
		if self.object:clsid()==clsid.controller_s and self.object:alive() then
			local npc=self.object:get_enemy()
			if npc then
				if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and 
				   npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then
        
					local sobj=alife():object( npc:id() )
					if sobj and sobj.online then
						local zomb = xr_logic.pstor_retrieve(db.actor, "zombies", {})
						zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)}
						xr_ligic.pstor_store(db.actor, "zombies", zomb)															
						npc:set_character_community("zombied",0,0)
						local orgtbl=amk.read_stalker_params(sobj)
						if (not string.find(orgtbl.profile,"_zombi")) then
							orgtbl.profile=orgtbl.profile.."_zombi"
						end
						amk.write_stalker_params(orgtbl,sobj)
					end
				end
			end
		end
    end

 

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


Ссылка на сообщение
(изменено)
@Graff46, в ЗП есть функция перемещения нпс: set_npc_position(vector), в ЧН/ТЧ, вроде, их только по нодам гонять можно. Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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


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

AMK-Team.ru

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