Вывод кастомной ошибки на худ

  • Автор темы Автор темы Danis
  • Дата начала Дата начала

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Можно сделать свою переменную ошибки как эта?
Код:
"#dota_hud_error_cant_cast_on_self"
типа такой
Код:
"#dota_hud_error_custom_error"
Пробовал не получилось, может кто знает как правильно делать?
Или вообще возможно вывести ошибку с кастомным текстом на худ?
 
Последнее редактирование модератором:
Очевидно ты плохо пробовал. Может саму ошибку не в тот файл локализации внес
 
И попробуй код выложить свой, а вдруг поможет.
 
ZLOY, ну я делал так, в коде скрипта использовал
Код:
if target:IsAncient() then return "#dota_hud_error_custom_is_ancient" end
В файле локализации использовал это
Код:
"dota_hud_error_custom_is_ancient" "This unit is ANCIENT"
Ошибку запихивал в англичанский файл локализации.
 
Последнее редактирование модератором:
Ты возвращаешь строку, а не ссылку на переменную со строкой.

Насколько я знаю - самостоятельно сослаться на переменную в txt, без использования созданных для этого API, нельзя, потому что все в операторе "" - строка. А в API используют парсер для определения знака ссылки #.
 
Последнее редактирование модератором:
Ты возвращаешь строку, а не ссылку на переменную со строкой.

Насколько я знаю - самостоятельно сослаться на переменную в txt, без использования созданных для этого API, нельзя, потому что все в операторе "" - строка. А в API используют парсер для определения знака ссылки #.
Бред

All CastFilterResult functions must return a UnitFilterResult enum value ( i.e. UF_SUCCESS, UF_FAIL_CUSTOM ). Return UF_SUCCESS causes the ability to pass the filter, calling UF_FAIL_CUSTOM causes the appropriate GetCustomCastError function to be called.
All GetCustomCastError functions must return a string value ( pointing to an appropriate entry in the addon_english.txt file )

Существует UF_FAIL_ANCIENT и не нужно использовать UF_FAIL_CUSTOM и функцию GetCustomCastError.
 
Последнее редактирование модератором:
Код:
function ancient_priestess_spirit_link:CastFilterResultTarget( hTarget )
	local nCasterID = self:GetCaster():GetPlayerOwnerID()
	local nTargetID = hTarget:GetPlayerOwnerID()
	
	--на клиенте невозможно проверить запрещена ли помощь союзникам 26.09.16
	if IsServer() and not hTarget:IsOpposingTeam(self:GetCaster():GetTeamNumber()) and PlayerResource:IsDisableHelpSetForPlayerID(nTargetID,nCasterID) then 	
		return UF_FAIL_DISABLE_HELP
	end

	return UnitFilter(hTarget,
		DOTA_UNIT_TARGET_TEAM_FRIENDLY,
		DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
		DOTA_UNIT_TARGET_FLAG_CHECK_DISABLE_HELP,
		self:GetCaster():GetTeamNumber() )
end

Вот такая штука у меня в карте вполне себе работает
 
Ну так он то, насколько я понял, пытается в неположенном месте обратиться к сообщению, а не в фильтре.
 
Последнее редактирование модератором:
Вот еслиб ZLOY скинул, как он переопределяет константу UF_FAIL_DISABLE_HELP своим сообщением, то уже может даже я смог бы ответить на твой вопрос.
 
Хотя по моему это вообще булевская величина. В таком случае я даже не могу понять, где у него вызов собственной переменной-ошибки с текстом.
 
UF_FAIL_* константы к каждой из которых привязано свое сообщение об ошибке. Но если функция CastFilterResultTarget вернет UF_FAIL_CUSTOM, то сообщение определяется функцией GetCustomCastError
 
Ну так и чего бредового в моих размышлениях выше?

Что в итоге мы имеем:
- есть специальная функция (API, как я и говорил) для сообщений об ошибках GetCustomCastError()
- есть специальные константы с конкретным значением для ошибок (которые, судя по всему, переопределить нельзя)

А сделать так, как хотел Danis, а точнее: обратиться к строке, в которую заключить ссылку на переменную в txt - нельзя. Почему нельзя? Потому что оператор, что делает из символов строку - "" - сделает из оператора # очередной символ строки, т.к. последний способен быть оператором лишь в тех местах, где работает парсер принимаемых переменных, а не ожидается строка.
 
Последнее редактирование модератором:
Я даже не мог представить что он в случайном месте будет возвращать строку с ошибкой
 
Danis, можешь тут вон глянуть пример абилки со своим сообщением об ошибке.
 
Я даже не мог представить что он в случайном месте будет возвращать строку с ошибкой

Ну так потому что у нас на форуме любят кидать фрагменты кода,а не картину в целом.

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

Код:
function item_dominator:CastFilterResult( hTarget )
	if IsServer() then
		if hTarget:IsAncient() then 
			return UF_FAIL_ANCIENT 
		elseif hTarget:IsMagicImmune() then 
			return UF_FAIL_MAGIC_IMMUNE_ENEMY 
		elseif IsBoss(hTarget) then 
			return UF_FAIL_CUSTOM
		elseif hTarget.dominated then 
			return UF_FAIL_DOMINATED
		end
	end
	return UF_SUCCESS
end
Код:
function item_dominator:GetCustomCastError()
	return "#dota_hud_error_custom_is_boss"
end
Код:
function item_dominator:OnSpellStart( )
	local caster = self:GetCaster()
	self.target = self:GetCursorTarget()
	local target = self.target
	local health = self:GetSpecialValueFor("health")
	local speed = self:GetSpecialValueFor("speed")

	if target:IsAncient() then return end 
	if target:IsMagicImmune() then return end
	if IsBoss(target) then return end
	if target.dominated then return end

		if not self.dominated_units then
			self.dominated_units = {}
		end

		for k,v in pairs(self.dominated_units) do
			if v and IsValidEntity(v) then 
				v.disable_drop = true
				v:ForceKill(false)
			end
		end

		self.dominated_units = {}

		local t_health = target:GetHealth()
		local t_max_health = target:GetMaxHealth()
		local t_speed = target:GetBaseMoveSpeed()
		target.disable_drop = true
		target:ForceKill(false)
		local unit = CreateUnitByName(target:GetUnitName(), target:GetAbsOrigin(), false, caster, caster, caster:GetTeamNumber() )
		unit:SetHealth(t_health)
		unit:AddNewModifier(caster, self, "modifier_dominator_health", {})
		unit:AddNewModifier(caster, self, "modifier_kill", {duration = self:GetSpecialValueFor("duration")})
		unit:SetControllableByPlayer(caster:GetPlayerOwnerID(),true)
		unit:SetOwner(caster)

		if t_max_health < health then
			print("Set Health to "..health)
		end

		if t_speed < speed then
			print("Set Movespeed to "..speed)
		end

		table.insert(self.dominated_units, unit)
	unit.dominated = true
end
Код:
"dota_hud_error_custom_is_boss"      "This unit is BOSS"
 
Последнее редактирование модератором:
Реклама: