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

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

2 часа назад, _Sk8_AsTeR_ сказал:

чтобы она вызывалась только при каждой загрузке сейва или локи?

В actor_binder:net_spawn попробуй.

  • Спасибо 1
Ссылка на комментарий

Вопрос относительно блокировки доступа к инвентарю. Даже целых три. Весьма понравились идеи из ОП-2.1 и НА-6, где нельзя открыть инвентарь в движении (вернее, ГГ остановится) и при перезарядке оружия. Кроме того, пытался реализовать автозакрытие инвентаря при поедании медикаментов/еды (с блокировкой доступа до истечения времени использования), но ничего не вышло. Если есть подобные методы, скриптово реализуемые, буду признателен.

Здесь могла быть ваша реклама.

Ссылка на комментарий

@_Sk8_AsTeR_, объявить таковую в одном скрипте и обратиться в другом. Объявлять без служебного слова local. Пример - db.script с известным множеством таблиц, которые много откуда читаются и используются в некоторых целях.

 

Объявление:

zone_by_name = {}

А в каком-нибудь xr_conditions.script:

function actor_in_zone(actor, npc, p)
    local zone = db.zone_by_name[p[1]]
    return utils.npc_in_zone(db.actor, zone)
end

 

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

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

@_Sk8_AsTeR_, можно ещё написать ф-цию которая возвращает значение нужной переменной, в другом скрипте создаете переменную с приравниванием к вызову ф-ции.

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

-- файл скрипта, например my_script.script --
local a = 5 -- переменная

function get_a()
	return a
end
--------------------------------

--- файл скрипта 2 "не важно имя файла" --

local a = my_script.get_a() -- теперь у нас в этом скрипте есть переменная "а" такая же как в "my_script.script"
 
-----------------------------------------

 

 

  • Спасибо 1
Ссылка на комментарий

@mole venomous
Закрыть инвентарь при использовании чего-либо можно так:
 

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


local objects = {
  [ "medkit" ] = true,
}


function on_use( obj )
  if objects[ obj:section() ] then
    local input = level.main_input_receiver()
    if input then
      level.start_stop_menu( input, true )  -- Закрываем инвентарь
    end
  end
end

-- Только такой способ знаю
function on_block_inventory()
  cmd( "unbind inventory" )
end

function cmd( scmd, ... )
  local args = { ... }
  if #args > 0 then
    scmd = scmd .. ' ' .. table.concat( args, ' ' )
  end
  get_console():execute( scmd )
end

 

 

  • Полезно 1

Важнейшая задача цивилизации - научить человека мыслить.

Ссылка на комментарий

Всем привет, вот такой словил ЛОГ вылета на Сталкер ЧН, думаю что из-за "не найденных анимаций" в HD Моделе NPC
 

Expression    : motion_ID.valid()
Function      : CKinematicsAnimated::ID_Cycle
File          : E:\priquel\sources\engine\Layers\xrRender\SkeletonAnimated.cpp
Line          : 208
Description   : ! MODEL: can't find cycle: 
Arguments     : idle

Нужна помощь как можно решить, или в чем проблема

Ссылка на комментарий

Подскажите пожалуйста, возможно ли такое реализовать на движке COP/COC, и если да, то какие могут быть подводные камни?

У меня появилась идея усложнить систему фаст тревала, когда ГГ может попросить НПС-проводника провести его к определенной точке. А именно: ГГ с проводником могут попасть в засаду реальных НПС и мутантов, которые находились "по маршруту" фаст тревела.

В теории это выглядит так: когда игрок выбирает точку для фастревела, скрипт берет текущую позицию ГГ и начинает "чертить маршут" от смарт террейна к смарт террейну - пока не дойдет до точки выбранной игроком. Но если на одном из этих смарт терейнов будет враждебный НПС или мутант - то ГГ и проводник телепортятся недалеко от этого смарт терейна и все враги находящиеся там- атакуюют ГГ.

Пример: ГГ в деревне новичков просит НПС сопроводить его до определенного места в темной долине. В это время на АТП находятся бандиты, которые враждебны ГГ. ГГ и проводник телепортятся возле АТП и вступают в бой с бандитами

--

зы: язык Lua для меня новый и я только собираюсь его начать изучать, чтобы реализовать подобный скрипт

Изменено пользователем blackburn1489
Ссылка на комментарий

Здрасьте.

 

Слепил уборщик бесхозного оружия:

• вызов из [scripts\bind_stalker.script] actor_binder:net_spawn(data);

• удалять все, кроме списка исключений;

• на текущей локации удалять, если рядом нет трупов;

• на других локациях удалять просто так.

 

Проблема: если вызывать скрипт каким-нибудь триггером (сброс бинта, например) в уже прогруженной локации, то ближайшие трупы учитываются и пушки, соответственно, лежат на месте. При вызове из "net_spawn" трупы в процессе прогрузки не обнаруживаются.

Вариант 1: https://drive.google.com/open?id=1-K5gPW3q3AUPN1bGXfEjBZ1Uj8kecjwh

 

Добавил задержку запуска через level.client_spawn_manager: трупы обнаруживаются и при вызове из "net_spawn", хотя задержка всего ничего.

Вариант 2: https://drive.google.com/open?id=1eEcuoF9Daw150FPWxpsAkXodliqAE2x1

 

Выходит, трупы на текущей локации загружаются чуть позже ГГ. Как это обойти без костылей?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Ребят, вопрос - загадка. С вашей помощью огромной наваял скриптец, благодаря которому через нетпакеты будут перебираться реально существующие НПС, их имена записаться в таблицу, и в итоге от их имени будут сообщения в чат приходить. И так случилось, что практически в начале игры (успел только АТП зачистить вначале) мне отписался Фанат. Официально он появляется после х-18, но он у меня отписался намного раньше.

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

function table_update_pda()
tab = {"пусто"}       -- обнуляем таблицу всех НПС
tab_newbIes = {"new"} -- обнуляем таблицу новичков

	for i = 1, 65535 do
		local sobj = alife():object(i)
		if (sobj) and IsNpcStalker(sobj) then  -- проверка на фракцию (только сталкер, долг, фридум, грин)
		
		local pk = get_netpk(sobj)
			if pk and pk:isOk() 
			then
				local data = pk:get()
				local charname = data.character_name
				table.insert(tab, charname)
					if (sobj) and is_npc_newbie(sobj) then  -- проверка на новичка
					table.insert(tab_newbIes, charname)	
					end
			end	

		end
	end
end

 

Так вот вопрос, игра где-то спавнит Фаната намного раньше, или я не понимаю как работает моя ф-ция? Помогите разобраться, ибо интрига!

Ссылка на комментарий
8 часов назад, Norman Eisenherz сказал:

Как это обойти без костылей?

Попробуй в апдейте биндера:

if device().precache_frame <= 1 then

     ....тут вызывай свой уборщик....

end

2 часа назад, _Sk8_AsTeR_ сказал:

Официально он появляется после х-18, но он у меня отписался намного раньше.

Фанат прописан в all.spawn, по этому спавнится с самого начала НИ, но до момента "Х" сидит в офф-лайне. А в чем проблема? Типа, до появления в качестве замены Волку в ДН, Фанат лежит в анабиозе в секретной лаборатории? И по тому не может писать сообщения, как любой другой сталкер?

Ссылка на комментарий

@Norman Eisenherz, делай проверку не по клиентским объектам, а по серверным.

Я смотрю, у тебя получается в цикле на 65535 ещё один цикл на 65535, это же аццкий ад какой-то. Не лучше будет пройтись один раз по всем объектам, разложив их по таблицам, а потом по этим таблицам уже проверять расстояния, паренты и т.д.?..

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

naxac.gif

Ссылка на комментарий

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Проблема: к серверному объекту невозможно применить проверку if not obj:alive(), хотя такая проверка есть в коде от Сяка.

 

Код оригинального уборщика (солянка 2010):

Spoiler

	for a=1,65534,1 do
	local obj = alife():object(a)
			if obj and game_graph():valid_vertex_id(obj.m_game_vertex_id)then
				local obj_clsid = obj:clsid()
		local obj_level = game_graph():vertex(obj.m_game_vertex_id):level_id()

				if IAmAStalker[obj_clsid] and obj_level~=actor_level then
				if not obj:alive() then 

 

 

Мой код:

Spoiler

	local act_lv = game_graph():vertex( act:game_vertex_id() ):level_id()

	local bodies = {}

	for i = 0, 65535 do
		local obj = alife():object(i)
		if obj and game_graph():valid_vertex_id( obj.m_game_vertex_id ) then
			local obj_lv = game_graph():vertex( obj.m_game_vertex_id ):level_id()

			if IsStalker(obj) and obj_lv == act_lv then
				if not obj:alive() then
					table.insert(bodies, obj)
				end
			end

 

 

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Попробовал проверку через свойство вместо метода:

if IsStalker(obj) and not obj.alive and obj_lv == act_lv

Обнаруживается единственный труп – сам Меченый. Настоящие трупы и еще живые NPC в список не попадают. Меченый – вампир? :shok2:

  • Смешно 2

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
Цитата

к серверному объекту невозможно применить проверку if not obj:alive()

Почему это? Она вполне работает. Например переделанном уборщике для ОП-2: https://github.com/naxac/CP2_AddOn/blob/master/gamedata/scripts/sak_off_corpses.script

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

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

naxac.gif

Ссылка на комментарий
21 час назад, Norman Eisenherz сказал:

от мифического Сяка

С чего это "мифический" вдруг? Вполне реальный человек.

Ссылка на комментарий

Доброго дня! Подскажите пожалуйста вот с чем...

Имеем мод на динамический костер "dynamic campfire".

Так вот, там многих, так сказать, бочек с кострами нету. Каким образом можно получить название лагеря? Надеюсь правильно вопрос задал.

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

	["esc2_st_fabric_kamp_1"] = {flame = "zone_flame_small_0001", light = "lights_camp_fire_omni_r1_r2_0001"},
	["esc_bridge_kamp_point"] = {flame = "zone_flame_small_0002", light = "lights_camp_fire_omni_r1_r2_0002"},
	["esc_lager_camp_center"] = {flame = "zone_flame_small_0004", light = "lights_camp_fire_omni_r1_r2_0004"},
	["esc_killers_kamp"] = {flame = "zone_flame_small_0004", light = "lights_camp_fire_omni_r1_r2_0004"},
	["esc_blokpost_kamp"] = {flame = "zone_flame_small_0005", light = "lights_camp_fire_omni_r1_r2_0005"},
	["esc2_most_kamp_1"] = {flame = "zone_flame_small_0006", light = "lights_camp_fire_omni_r1_r2_0006"},
	["esc_assault_kamp_center1"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"},
	["esc_fabrika_bandit_camp_center"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"},
	["esc2_st_fabric_kamp_2"] = {flame = "zone_flame_small_0007", light = "lights_camp_fire_omni_r1_r2_0007"},
	["esc2_bandit_les_kamp_1"] = {flame = "zone_flame_small_0008", light = "lights_camp_fire_omni_r1_r2_0008"},
	["esc_stalker_camp_esc_fox_kamp"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"},
	["esc2_st_fox_place_kamp_1"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"},
	["esc_stalker_camp_camp_point"] = {flame = "zone_flame_small_0009", light = "lights_camp_fire_omni_r1_r2_0009"},

 

 

Ссылка на комментарий

@naxac То, что в другом коде работает, я знаю, но я ловлю вылет с ошибкой "attempt to call method 'alive' (a nil value)". Может, вообще не в этой проверке ошибка? Вот последняя версия (пока что "not obj.alive"): https://drive.google.com/open?id=1-K5gPW3q3AUPN1bGXfEjBZ1Uj8kecjwh

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

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