Jump to content

Recommended Posts

_Sk8_AsTeR_    1

@AndreySol, а разве они оффлайн не подбирают?

Они умеют в оффлайне драться, например, и вроде там же арты подбирают те же. amk_offline_alife.script

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

--есть бесхозное оружие
	amk.oau_reason="cn offline_alife chp13 "..tostring(victim and victim:name())
						on_weapons_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif #vdata.artefacts>0 then
					--есть арты
	amk.oau_reason="cn offline_alife chp14 "..tostring(victim and victim:name())
						on_artifacts_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif #vdata.inv_boxes>0 then
					--есть контейнеры. Надо обыскать.
	amk.oau_reason="cn offline_alife chp18 "..tostring(victim and victim:name())
						on_inv_boxes_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif items[victim.id] and #items[victim.id] > 0 then
					--попробуем продать всякого
	amk.oau_reason="cn offline_alife chp15 "..tostring(victim and victim:name())
						-- amk.mylog("Offline: lets trade")
	amk.oau_reason="cn offline_alife chp17 "..tostring(victim and victim:name())
						process_trade(victim)
						-- amk.mylog("Offline: trade done")
						break

 

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

function on_artifacts_found(victim, vdata)
	if (victim == nil or vdata == nil) then return end
	local obj, v_obj
	local object
	local v_id = victim.id
	local b_stalker = false
	-- Если сталкер - дадим опыт.
	if victim and IAmAStalker[victim:clsid()] and victim.community then
		local m_comm  = victim:community()
		if (m_comm == "stalker" or m_comm == "dolg" or m_comm == "freedom") then
			b_stalker = true
		end
	end
	for i=1, #vdata.artefacts do
		v_obj = vdata.artefacts[i]
		if (v_obj) then
			object = alife():object(v_obj.id)
			if (object and object:name() == v_obj.name) then
				obj = pick_item(victim, object)
				if (obj) then
					if (b_stalker == true) then
						victim:set_rank(victim:rank() + rate_art_found)
					end
				end
			end
		end
	end
	process_trade(victim)
end

 

 

Edited by _Sk8_AsTeR_

Share this post


Link to post
Share on other sites

Ребята, как узнать на карте произвольный level_vertex_id, ну например, level_vertex_id(30078) - а мне возвращает если он существует то true и его координаты, а если его не существует то возвращает просто false, как такое реализовать?

 

upd: или как узнать по координатам ID вертекса и валидный он или нет? Например, я запрашиваю произвольные координаты на локации на которой находится ГГ, а мне возвращает по этим координатам level_vertex_id и то есть ли он там на самом деле, грубо говоря - если клетка АI сетки по этим координатам?


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
naxac    1,201
Цитата

как узнать на карте произвольный level_vertex_id

@Баба ЯГА, например так

local v = math.random(1, vertex_count)

Количество вертексов фиксированное, т ч. можно составить табличку [имя уровня] = кол-во вертексов.

Позиция вертекса: level.vertex_position(level_vertex)

Обратной функции в ТЧ точно нет, про ЧН/ЗП не в курсе. Есть в X-Ray Extensions:

level.vertex_id_by_pos = function ( position )
	db.actor:set_vector_global_arg_1( position )
	return level.vertex_id()
	end


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

naxac.gif

Share this post


Link to post
Share on other sites

@naxac, жаль что нельзя по координатам узнать ID вертекса :( 

14 минут назад, naxac сказал:

Количество вертексов фиксированное, т ч. можно составить табличку [имя уровня] = кол-во вертексов.

Позиция вертекса: level.vertex_position(level_vertex)

Я об этом думал, но, вот тут проблема,, например на Кордоне = 539254 вертекса, а при переборе показывает только 5421 из них 4702 - валидных... Если перебирать свыше 300000 - вылет. Ничего понять не могу... Я так понимаю, что клетка AI сетки - это и есть вертекс, значит на Кордоне должно быть 539254 вертекса по количеству AI клеток.

17 минут назад, naxac сказал:

Есть в X-Ray Extensions:

Я не знаю что это такое... :( 


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
naxac    1,201
Posted (edited)

@Баба ЯГА, level_vertex не может быть невалидным по определению. Невалидным для AI может быть game_vertex, если он расположен вне аи-сетки.

Цитата

Я не знаю что это такое...

https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/

Edited by naxac

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

naxac.gif

Share this post


Link to post
Share on other sites

@naxac, хорошо, как тогда перебрать все вертексы на Кордоне например?

Вот так у меня показывает 4477 вертекса

function GetLevelsVertexes(lname)
  local t = {}
  local i = 0
  local graph = game_graph()
  local sim = alife()
  while graph:valid_vertex_id(i) do
    local v = graph:vertex(i)
    local ln = sim:level_name(v:level_id())
    if ln == lname then
      t[#t+1] = v:level_vertex_id()
    end
    i = i+1
  end
  return t, i
end

local t,i =  GetLevelsVertexes(level.name())

а вот так показывает 5704 вертекса на Кордоне, а реально там 500000 клеток (а значит и вертексов)

local colco_ver = 0
local all_colvo = 0
clear_log()
while all_colvo < 350000 do
  if game_graph():vertex(all_colvo):level_id() == alife():level_id() then
    colco_ver = colco_ver + 1
    --gc:execute( "load ~:> vertex_id ="..i..", " )
  end
  all_colvo = all_colvo + 1
end

 

upd: вот тут хотел поставить 600000 (предварительно количество посмотрел в LE) чтобы с запасом, но, как я и говорил если ставить больше чем 300000 - то вылет.

while all_colvo < 350000 do

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
naxac    1,201
Posted (edited)

@Баба ЯГА, так оно и не покажет реальное количество нод, это же только вертексы точек графа. Реальное количество нужно смотреть в level.gct локации (или в level.ai, не помню, склероз, чтоб его...), с помощью, например, Graph Viewer, скриптами его не получить.

Edited by naxac

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

naxac.gif

Share this post


Link to post
Share on other sites

@naxac, так а что тогда возвращает db.actor:level_vertex_id() ? Что-то я запутался совсем... 

Я смотрел реальное количество клеток АИ так: открыл Кордон в LE и выделил все клетки и там внизу показывает количество выделенных клеток.

Труба, короче. Я хотел определить какие вертексы есть вокруг ГГ в радиусе, скажем 3 метра, а потом вывести АИ сетку эту (кусочек) - на экран. Но выходит - ничего не выйдет.... :( 


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
naxac    1,201

@Баба ЯГА, почему же не выйдет. Перебирай все вертексы локации и проверяй расстояние. Если меньше 3х, то выводи на экран.

for i = 1, count do

  if level.vertex_position(i):distance_to(db.actor:position()) <= 3 then

-- тут выводишь клетку

...

 


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

naxac.gif

Share this post


Link to post
Share on other sites
7 минут назад, naxac сказал:

for i = 1, count do

хорошо, а COUNT - сколько ставить? Если больше 300000 - вылет

upd: попробуй сам перебрать вертексы и сам всё увидишь, не работает такой перебор, он всё не перебирает.


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
naxac    1,201
Posted (edited)

@Баба ЯГА, вот так только что попробовал, всё работает:

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

function ggg()
	local pos = db.actor:position()
	local vpos
	local n = 0
	for i = 1, 595499 do	-- для Кордона
		vpos = level.vertex_position(i)
		if vpos and vpos:distance_to_sqr(pos) < 9 then
			n = n + 1
			log(i)
		end
	end
	log("found %s vertexes", n)
end

 

вот что получил:

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

385291
386206
386207
386208
386209
386210
387120
387121
387122
387123
387124
387125
387126
388033
388034
388035
388036
388037
388038
388039
388945
388946
388947
388948
388949
388950
388951
389852
389853
389854
389855
389856
389857
389858
389859
390747
390748
390749
390750
390751
390752
390753
391639
391640
391641
391642
391643
391644
391645
392549
392550
392551
392552
found 53 vertexes

 

Edited by naxac

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

naxac.gif

Share this post


Link to post
Share on other sites

@naxac, точно, проверил, всё работает! Ты меня просто спас :159:

Ничего не пойму, а чего у меня вылетало тогда? Я же вроде всё тоже-самое делал... :russian_ru:

1 час назад, naxac сказал:

с помощью, например, Graph Viewer

где его взять? Чтобы каждую локацию не декомпилировать для LE?


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites

@naxac, спасибо! :drinks:


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites
abramcumner    836
4 часа назад, Баба ЯГА сказал:

Я же вроде всё тоже-самое делал... :russian_ru:

Вообще не то же самое. Ты перебирал game-вертексы, game-вертексы объединены в game_graph, у game-вертекса есть game_vertex_id. Соответствуют graph_point в СДК. Их на локацию в среднем по 250 штук, ну и на всю игру тысяч 5.

А есть level-вертексы с level_vertex_id. Соотвествуют аи-нодам в СДК, на каждой локации по 500к.

 

  • Согласен 3

Share this post


Link to post
Share on other sites
Graff46    415

Интересует вопрос навигации НПС в оффлайне и на другие локации. Для того чтобы отправить куда-то НПС (он может уходить в оффлайн и переходить на другие локации) используется метод что-то вроде :set_move_path(). Я писал схемы логики без патч и лук поинтов, НПС передвигаются/стоят на основе данных левел вертексов, по сути задаем НПС поворот и заставляем идти пока дистанция до левел вертекса будет достаточно мала, это всё работает на онлайновском НПС и в пределах локации. Меня интересует вопрос можно ли скриптово без использования патч поинтов заставить НПС ходить в оффлайне и на другие локации?


fe2f085fa6ec930af82f5856df7e561b.jpg

Share this post


Link to post
Share on other sites
Kirgudu    630

@Баба ЯГА, обрати внимание на модуль lua_helper. В нём есть уже готовые функции как для поиска минимальных и максимальных game- и level-вертексов на локации, так и для определения ближайшего вертекса к заданным координатам ( а также куча других полезных функций). Если нет желания интегрировать весь модуль в свой мод, можно как минимум изучить реализацию.

Share this post


Link to post
Share on other sites

@abramcumner, начинаю вникать потихоньку...

@Kirgudu, обязательно посмотрю.

 

Ребята, как поставить метку на карту по заданным координатам? Не на объект, а просто в нужную точку на карте?

upd:  есть идея поставить пустой рестриктор и на него поставить метку, но возникает вопрос - можно ли ставить пустой рестриктор и будет ли это большая нагрузка на ресурсы если таких рестрикторов и меток будет скажем - 500 штук?

upd2: где-то видел не могу найти - как заспавнить пустой рестриктор через скрипт?

Нашёл, вот так можно?

local sobj = alife():create( "space_restrictor", pos, lv, gv )

upd3: и ещё. можно ли поставить метку на level_vertex?


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites

@Kirgudu, понял, спасибо. Возник вопрос: 

как узнать gv вертекса. если я знаю ID и позицию (координаты)?

local lvid = 30087
local vpos = level.vertex_position( lvid )
local sobj = alife():create( "space_restrictor", vpos, lvid, gv ) -- КАК УЗНАТЬ gv ???

 

Как узнать gv ?? :russian_ru:

9 минут назад, Kirgudu сказал:

сам же спрашивал и уже получал ответ здесь.

я помню что спрашивал уже это, искал тут, но не нашёл, пришлось спросить ещё раз... :blush:


Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...