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

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

Я написал схему поведения для НПС с одним action, она нормально работает, потом прекондишины отрубают мой экшен, подключается алайф экшен, НПС начинает просто "гулять". Затем я снова загоняю НПС в схему поведения, во 2й раз все идет не как должно - у экшена (не алайф) срабытывает метод activate_scheme и все, метод execute не работает совсем, НПС топчится на месте. Скрипт схемы поведения.

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

В сборке Артосовских модулей обнаружил проблему.

Скрипт

--/-------------------------------------------------------------------
--/ Принудительное прерывание игры при фатальных ошибках
--/-------------------------------------------------------------------
abort = function(fmt,...)
	to_log(string.rep("~",86))
	assert("[error]ABORT CALLED:\n" .. string.exformat(fmt, ...))
	to_log("ATTENTION! Game is interrupted! The information in lines above.")
	to_log(string.rep("~",86))
	get_console():execute('flush')
	exit() --/#!# interrupt game in case of fatal errors
end
--/ ------------------------------------------------------------------

Часто вместо того что бы указывать в логе на именно допущенную ошибку, игра ругается на строчку     exit() --/#!# interrupt game in case of fatal errors

и думай, годай - где кака зарыта???

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@UriZzz, функция эта вызывается для принудительного краша игры, и она должна выводить в лог сообщение об ошибке до вылета: смотри выше сообщения с "фатал эррором". 

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

naxac.gif

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

@naxac, да, знаю, но лог в подавляющем большинстве случаев ссылается именно на эту строчку

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ATTENTION! Game is interrupted! The information in lines above.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Log file has been saved successfully!
 
FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ....a.l.k.e.r Тень Чернобыля\gamedata\scripts\_g.script:1304: attempt to call global 'exit' (a nil value)
 

stack trace:

 

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@UriZzz, всё верно, именно эта строка и крашит игру после вывода сообщения об ошибке. Сама ошибка указана выше верхней строки с тильдами, тут ее не видно.

  • Спасибо 1

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

naxac.gif

Ссылка на комментарий
4 часа назад, UriZzz сказал:

эту строчку

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

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

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

"New Sleep Mod" для ТЧ

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

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...stalker_fin_up\gamedata\scripts\sleep_manager.script:111: attempt to index local 'ph_element' (a nil value)
 

stack trace:

Регулярно вылетает с одной и той же ошибкой при разрушении какого нибудь объекта на локации.

Сам sleep_manager.script :
 

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

--=======================================================--
-- Скрипт cна                                            --
-- Авторы: Mechanic, Shoker, Z.E.N., Ab@dDon             --
-- Может кого не указал, но скрипт брал из Zenoban Mod'а --
--=======================================================--

local table_sleep_zone =
	{
	-- Кордон:
	
    -- Матрас на чердаке в доме возле Лиса
    {"l01_escape", "m", nil, 140.09, 3.5, 336.91, 444961, 232, nil}, 

    -- Матрасы в подвале в деревне новичков
    {"l01_escape", "m", "no_icon_1", -210.73, -22.9, -122.30, 42632, 59, nil},
    {"l01_escape", "m", "icon_1", -210.34, -22.9, -125.75, 42632, 59, nil}, 

	-- Свалка:
	
    -- Матрас в ангаре возле группы Серого
    {"l02_garbage", "m", nil, -70.34, -1.60, 19.88, 131025, 329, nil},

    -- Матрас в вагончике возле заставы долга
    {"l02_garbage", "m", nil, 46.73, 1.56, 243.93, 218601, 359, nil},

	-- Агропром:
	
	-- Матрасы в конце ж/д тунеля с аномалиями
	{"l03_agroprom", "m", "icon_2", 254.96, 0.15, 74.44, 428649, 498, nil},
	{"l03_agroprom", "m", "no_icon_2", 257.46, 0.15, 73.50, 429416, 498, nil},
	
	-- Подземелья Агропрома:
	
    -- Матрас в тайнике Стрелка
	{"l03u_agr_underground", "b", nil, -69.74, -6.87, -74.45, 3439, 717},
    {"l03u_agr_underground", "m", nil, -69.74, -6.35, -74.45, 3439, 717, "allways"},
	
	-- Бар:
	
    -- Матрасы на базе Долга
    {"l05_bar", "m", "icon_3", 232.28, -4.9, 131.44, 59301, 1200, nil},
    {"l05_bar", "m", "no_icon_3", 232.08, -4.9, 135.36, 59301, 1200, nil},
	
	-- Матрас в комнате Бармена (за барной стойкой)
	{"l05_bar", "b", nil, 115.85, -5.3, 12.0, 33756, 1239},
	{"l05_bar", "m", nil, 115.85, -4.6, 12.0, 33756, 1239, "allways"},

	-- Янтарь:
	
    -- Матрасы в бункере ученых на Янтаре
    {"l08_yantar", "m", "no_icon_4", 30.36, -10.98, -280.2, 54978, 1480, "allways"},
    {"l08_yantar", "m", "icon_4", 27.68, -10.98, -280.2, 54978, 1480, "allways"},

	-- Армейские склады:

    -- Матрасы на базе Свободы в казармах
    {"l07_military", "m", "no_icon_5", 14.07, -6.82, 13.1, 319840, 1582, nil},
    {"l07_military", "m", "icon_5", 11.18, -6.82, 13.27, 317158, 1582, nil},

    -- Матрас в комнате напротив Скряги
    {"l07_military", "m", nil, -25.39, -6.82, -26.74, 281271, 1593, nil}
	
	--[[
	-- Это места, где можно поспать (требует начало новой игры)
	{"1", "2", "3", 4, 5, 6, 7, 8, "9", "10"}
	1 - название уровня
	2 - m или b (m - невидимый объект, при клике на который мы спим, b - кровать, для декорации)
	3 - если написать что-нибудь в "" и !добавить! эту запись в таблицу ниже, то на глобальной/мини карте для этого матраса не будет иконки сна (только для невидимого объекта)
	4,5,6 - координаты x,y,z соответственно
	7,8 - level_vertex и game_vertex соответственно
	9 - если стоит "allways" значит можно спать независимо от наличия рядом врагов (только для невидимого объекта)
	]]
	}
 
-- таблица матрасов, при использовании которых никогда не ставить метки
local table_non_spot_sleep_zone =
	{
	["no_icon_1"]	= true,
	["no_icon_2"]	= true,
	["no_icon_3"]	= true,
	["no_icon_4"]	= true,
	["no_icon_5"]	= true
	}

local mattress_id = {}
local mattress_count = 0
local mattress_processed = 0
local first_scaling
local left_scaling
local last_health
local ENEMY_RADIUS = 15 -- радиус врагов

-- Обычный апдейт
function update(delta)

	local mcnt = load_variable("matras_cnt", 0)

	for i=1, mcnt do
		local obj = level.object_by_id(load_variable(i.."_matras", 65000))
		if obj then
			---------------------
			--get_console():execute("THIS_IS_SPARTA!")
			--get_console():execute(obj:name())
			local bone_name = get_ltx(obj:section(), "fixed_bone", "str")
			local ph_shell = obj:get_physics_shell()
			if not ph_shell then
				--get_console():execute("NO_PH_SHELL")
				return
			end
			local ph_element = ph_shell:get_element_by_bone_name(bone_name)
			if ph_element:is_fixed() then
				--get_console():execute("ART_FIXED")
			else
				--get_console():execute("FIXING_OBJECT")
				ph_element:fix()
			end
			---------------------
		end
	end

	if db.actor == nil  then
		return 
	end

	if not db.actor:alive() then
		local hud = get_hud()

		local custom_static = hud:GetCustomStatic("hud_mattress")
		if custom_static ~= nil then
			hud:RemoveCustomStatic("hud_mattress")
		end
	end

	local actor = db.actor
	local pos = actor:position()
	local zn = actor_in_sleep_zone(pos)

	if load_variable("bed_spawned", false) == false then
		spawn_mattress()
		save_variable("bed_spawned", true)
	end

	if zn == "m" then
		local hud = get_hud()
		local custom_static = hud:GetCustomStatic("hud_mattress")
		if custom_static == nil then
			hud:AddCustomStatic("hud_mattress", true)
		end
	else
		local hud = get_hud()

		local custom_static = hud:GetCustomStatic("hud_mattress")
		if custom_static ~= nil then
			hud:RemoveCustomStatic("hud_mattress")
		end
	end
end

-- Update матраса(вешаем колбек если ещё не повесили)
function mattress_update(obj)
	if mattress_count ~= mattress_processed then
		for kk,vv in pairs(mattress_id) do
			if vv[1] == obj:id() and vv[2] == false then
				vv[2] = true
				obj:set_callback(callback.use_object, this.mattress_use)
				obj:set_tip_text("tip_sleep")
				mattress_processed = mattress_processed + 1
			end
		end
	end
end

-- Отлавливаем спавн матрасов и запоминаем их id
function mattress_spawn(obj)
	mattress_count = mattress_count + 1
	local m = {obj:id(), false}
	table.insert(mattress_id, m)
end

-- Юзаем матрас
function mattress_use(obj, who)
	if test_for_can_sleep(obj) then
	-------------------------------
		local hud = get_hud()
		local spwn = ui_sleep.sleep(hud)
		local frst
		local scnd
		level.start_stop_menu(spwn,true)
		
		-- можно ли ставить спот
		local valid = true
			
		for name, val in pairs(db.storage[db.actor:id()].pstor) do
			if table_non_spot_sleep_zone[name] and load_variable(name, -1) == obj:id() then
				valid = false
			end
		end
		if valid then
			if not level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна") then
				level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна")
			end
		end
		
		for i = 1, 5 do
			frst = load_variable("no_icon_"..i, -1)
			scnd = load_variable("icon_"..i, -1)
			if frst == obj:id() and not level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна") then
			level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна")
			end
		end
	-------------------------------
	end
end
	
-- Игрок в зоне сна
function actor_in_sleep_zone(pos)
	for i,z in pairs(table_sleep_zone) do
		if z[1] == level.name() and z[2] == "m" and actor_in_zone(z[4], z[5], z[6], 2, pos) then
			return z[2]
		end
	end
	return ""
end

-- Спавним всё, что нужно
function spawn_mattress()
	for kk,vv in pairs(table_sleep_zone) do
		if vv[2] == "m" then
			local obj = alife():create("mattress", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8])
		 	if vv[9] == "allways" then
				save_variable(obj:name().."_allways_sleep", true)
			end
			if vv[3] then
				save_variable(vv[3], obj.id)
			end
		end
		if vv[2] == "b" then
			local obj = alife():create("bed_matras", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8])
			local i = load_variable("matras_cnt", 1)
			save_variable(i.."_matras", obj.id)
			save_variable("matras_cnt", i+1)
		end
	end
end

-- Проверка, можно ли спать
function test_for_can_sleep(matras)
	local allways = load_variable(matras:name().."_allways_sleep", false)

	-- проверка на врагов
	if not allways then
		for a=1,65535 do
			local obj = level.object_by_id(a)
			if obj then
				if ((IsStalker(obj) and get_npc_relation(obj,db.actor)=="enemy") or IsMonster(obj)) and obj:position():distance_to(db.actor:position())<ENEMY_RADIUS then
					news_manager.send_tip(db.actor, "sleep_warning_enemy", nil, "default", 5000)
					return false
				end
			end
		end
	end

	-- проверка на радиацию
	if db.actor.radiation > 0 then
		news_manager.send_tip(db.actor, "sleep_warning_radiation", nil, "default", 5000)
		return false
	end

	return true
end

-- Спать
function sleep(h)
	sleep_manager.start_sleep(h)
end

function start_sleep(scale)
	local sleep_ltx = ini_file ("scripts\\actorsleep.ltx")
	schemes["ar_sleep"] = "ar_sleep"
	ar_sleep.set_scheme(db.actor, sleep_ltx, "ar_sleep", logic)
	db.actor:stop_talk()
	db.actor:hide_weapon()
	level.disable_input()
	sleep_manager.starter (scale)
end

function starter(scale)
	last_health = db.actor.health	
	left_scaling = scale
	first_scaling = scale

	_G.mus_vol = get_console():get_float("snd_volume_music")
	_G.amb_vol = get_console():get_float("snd_volume_eff")
	get_console():execute("snd_volume_music 0")
	get_console():execute("snd_volume_eff 0")

	game.start_tutorial("time_scaling")
	level.set_time_factor(3460)
end

-- Вызывается каждый час сна
function stop_scaling()
	left_scaling = left_scaling - 1
	if left_scaling + 1 == first_scaling and last_health > db.actor.health then
		sleep_manager.dreamer()
		news_manager.send_tip(db.actor, "sleep_warning_satiety_or_bleeding", nil, "default", 5000)
	elseif left_scaling > 0 and last_health <= db.actor.health  then
		sleep_manager.hp_corrector(2)
		last_health = db.actor.health
	  	game.start_tutorial("time_scaling")
	elseif left_scaling > 0 and last_health > db.actor.health  then
		sleep_manager.hp_corrector(12)
		last_health = db.actor.health
		game.start_tutorial("time_scaling")
	elseif left_scaling <= 0 and last_health > db.actor.health  then
		sleep_manager.hp_corrector(12)
		db.actor.power = 1
		last_health = db.actor.health
		sleep_manager.dreamer()
	elseif left_scaling <= 0 and last_health <= db.actor.health then
		db.actor.power = 1
		sleep_manager.dreamer()
	end	
end

function dreamer()
	level.set_time_factor(system_ini():r_float("alife","time_factor"))
	if sleep_manager.is_sleep_active() then
		get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
		get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
		_G.amb_vol = 0
		_G.mus_vol = 0
		sleep_manager.stopper()
	end
end

function stopper()
	level.set_time_factor(system_ini():r_float("alife","time_factor"))
	ar_sleep.disable_scheme()
	if not db.actor:alive() then
		sleep_manager.onliner()
	else 
		db.actor:restore_weapon()
	end
	level.enable_input()	
end

-- Игрок умер во время сна 
function onliner()
	get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
	get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
	_G.amb_vol = 0
	_G.mus_vol = 0
end

function hp_corrector(fr)
	db.actor.health = fr/12
end

function is_sleep_active()
	if db.storage[db.actor:id()].active_scheme == "ar_sleep" then 
		return true 
	end
	return false
end

-----------------------------------------------------
-------------- Вспомогательные функции --------------
-----------------------------------------------------

-- Записываем переменную
function save_variable(variable_name, value)
	xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load_variable(variable_name, value_if_not_found)
	return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del_variable(variable_name)
	if db.storage[db.actor:id()].pstor[variable_name] then
		db.storage[db.actor:id()].pstor[variable_name] = nil
	end
end

-- Проверка на наличие актора в области
function actor_in_zone(x, y, z, r, pos)
	if math.pow(x-pos.x,2) + math.pow(y-pos.y,2) + math.pow(z-pos.z,2) <= math.pow(r,2) then
		return true
	else
		return false
	end
end

-- Узнаём отношения (взято из AMK)
function get_npc_relation(obj,target)
	local rel = obj:relation(target)
	local relation
	if rel == game_object.neutral then
		relation = "neutral"
	elseif rel == game_object.friend then
		relation = "friend"
	elseif rel == game_object.enemy then
		relation = "enemy"
	else
		return false
	end
	return relation
end

-- Получаем строку из LTX файла
function get_ltx(l_name,l_string,type)
	if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then
		if type=="bol" then
			return system_ini():r_bool(l_name, l_string)
		end
		if type=="num" then   -- целое число
			return tonumber(system_ini():r_u32(l_name, l_string))
		end
		if type=="num_float" then   -- число с запятой
			return tonumber(system_ini():r_float(l_name, l_string))
		end
		if type=="str" then
			return tostring(system_ini():r_string(l_name, l_string))
		end
		if type==nil then
			return system_ini():r_u32(l_name, l_string)
		end
	end
	return nil
end

 

 

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

@Space.Marine, вот здесь:

local ph_element = ph_shell:get_element_by_bone_name(bone_name)
if ph_element:is_fixed() then
  --get_console():execute("ART_FIXED")
else
  --get_console():execute("FIXING_OBJECT")
  ph_element:fix()
end

добавь проверку, вот так:

local ph_element = ph_shell:get_element_by_bone_name(bone_name)
if ph_element and not ph_element:is_fixed() then
  ph_element:fix()
end
Изменено пользователем naxac
  • Спасибо 1
  • Полезно 1

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

naxac.gif

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

Вопрос про добавление имён/кличек неквестовых NPC:
Правильно ли я думаю, что чтобы добавить дополнительные имена сталкеров, нужно использовать эти файлы: generate_fnames.xml и generate_snames.xml?
(Именно дополнить к существующим, а не заменить старые имена)
К примеру, в файле generate_fnames.xml есть 103 вхождения тэгов <string id="name_stalker_№">.
Я попробовал удалить все, оставив только два:  <string id="name_stalker_1"> и <string id="name_stalker_2">.  
Далее заспавнил сталкера, и получил это:
ecdbb09b8226t.jpg
А это значит, что игра не определяет количество вхождений имён в файле  автоматически, а где-то указана конкретная цифра (104?).
Где задаётся этот параметр? Или же вообще я рассуждаю неправильно?
(Если обсуждалось, намекните, где. Поиск на "добавить имена / клички"  в самых разных комбинациях результата не дал)

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

@phalcor, смотри в  system.ltx

 

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


;*****************************************
; ГЕНЕРАТОРЫ ИМЕН
;*****************************************
[stalker_names_stalker]
name_cnt		= 102
last_name_cnt	= 599

[stalker_names_bandit]
name_cnt		= 36
last_name_cnt	= 180

[stalker_names_science]
name_cnt		= 14
last_name_cnt	= 27

[stalker_names_private]
name_cnt		= 1
last_name_cnt	= 200

[stalker_names_sergeant]
name_cnt		= 1
last_name_cnt	= 200

[stalker_names_lieutenant]
name_cnt		= 1
last_name_cnt	= 200

[stalker_names_captain]
name_cnt		= 1
last_name_cnt	= 200

 

 

  • Полезно 2
Ссылка на комментарий

Здрасьте.

 

Описание предмета в любом инвентарном окне, насколько можно судить, есть окно CUIScrollView() + вложенное окно CUIStatic() с текстом. Если диапазон прокрутки равен высоте статика, то как высота статика подстраивается под высоту текста? При ручном указании высоты либо текст будет выходить за статик и прокрутка остановится на границе статика, либо статик будет больше текста и прокрутка будет избыточной.

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

Шпаргалка

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

@Norman Eisenherz, в движке у CUIStatic есть метод AdjustHeightToText - он как раз подгоняет высоту статика по высоте текста. Также этот метод "вытащен" в скрипты в X-Ray Extensions.

  • Полезно 1

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

naxac.gif

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

Добрый день. 

Существует ли для базового ТЧ 1.0006 способ отловить хит по актёру. Вернее, не сам факт причинения ущерба, а какой тип хита и чем/кем нанесён?

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

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

Хочу просмотреть инвентарь трупа. Делаю так:

 

for a=1,65534 do
	obj = server_object(a)
	if obj then
		o.clsid = obj:clsid()
		if iAmStalker[o.clsid] then			
			local cnt
			obj:iterate_inventory(function (dummy, item)
				if item:section()~="bolt" then
					cnt=cnt+1
				end                                    
			end, nil)		
		end
	end
end

А в ответ: attempt to call method 'iterate_inventory' (a nil value)

Пробовал разные комбинации - ну никак, всегда эта ошибка. Как это сделать правильно? 

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

@WinCap, ошибка. Cobj всегда равен nil.

Объясню чуть подробнее. Я захотел, чтобы скрипт-уборщик из ОП 2.1 не удалял трупы, в которых хоть что-то есть. В этот скрипт (sak_off_corpses) я попытался вставить проверку на это дело.
Уборщик отрабатывает при переходе на другу локацию, может в этом дело? Может быть есть другой способ определить само наличие инвентаря без конкретики?
Вот моя вставка:
 

-- зачистка трупов сталкеров
function clear_corpses()
	for id,obj in pairs(corpses) do
		-- удаляем только трупы без неудаляемых предметов
		if not parents[id] then
			printf("corpses: Удалили "..obj:name())
			
--ВОТ ТУТ Я ВСТАВЛЯЮ СВОЮ ПРОВЕРКУ И ВСЕГДА ОШИБКА....			
----------------------------------------------------
			local cnt=0			
			local trup = level.object_by_id(obj.id)
			trup:iterate_inventory_simple(
				function (item)
					if item:section()~="bolt" then
							cnt=cnt+1
					end
				end
			)
-----------------------------------------------------			
			
			release(obj)		
		end
	end
end

 

Ссылка на комментарий
Только что, phalcor сказал:

Уборщик отрабатывает при переходе на другу локацию

Из нет_спавна стартует? :) там еще никакие неписи в онлайн не загружены, актор загружается первым. Поэтому и клиентских объектов нет.

Через серверные объекты, надо пробежать 65535 объектов и посмотреть у них parent_id. У кого будет - занести значения в таблицу. А потом серверные объекты трупов сравнивать по id с этой таблицей. Если найдется совпадение, значит в трупе что-то есть.

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Здрасьте.

 

ТЧ 1.0006, попытка имитации CUIComboBox() через обычный список:

• если текстура элемента списка указана ссылкой на описание в [ui_common.xls], текст этого элемента смещается вправо на ширину текстуры;

• если та же текстура указана ссылкой на весь файл [ui_common.dds] и область в нем, текст, как и требуется, выводится поверх текстуры.

https://drive.google.com/open?id=1Ty9_tmfyr2j7537nbliZEUETrwrwKvR3

 

В чем может быть причина?

Файлы: https://drive.google.com/open?id=1VV6GAoapgwdqGIS27TN1oe8Wj83K46Zh.

 

 

Еще вопрос: при масштабировании текстуры рамки через CUIFrameWindow() на стыке кусочков текстуры иногда выводится горизонтальная полоса из пустых пикселей (см. ту же картинку). Поправимо ли это? Такую же полосу можно наблюдать в разделе КПК "Карта".

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

Шпаргалка

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

Подскажите почему когда я заспавнил НПС, перевёл его в оффлайн, в оффлайне НПС переместился на другой гейм-вертекс, я перевожу НПС в онлайн, то НПС появляется на том месте где я его ранее перевёл в оффлайн?

P. S.

Сделал тесты:

  1. Позиция НПС в оффлайне обновляется, как и левел\гейм вертексы, то ли редко (через 5-6 апдейтов), то ли по расстоянию (когда ушли далеко от последней записанной позиции)
  2. Метка на НПС движется явно более "отчетливо", позиция метки на карте меняется чаще чем значение позиции у НПС (оффлайневского), обновление позиции метки совпадает с вызовом апдейта НПС в оффлайне (~4сек)
  3. По 1 пункту, есть странная особенность: когда НПС "близко" до целевого левел-вертекса, его позиция обновляется чаще, вплоть до обновления на каждом апдейте. ?(Возможно обновление оффлайн позиции НПС зависит от расстояния до целевого левел-вертекса)?
Изменено пользователем Graff46
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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