[lua] Повышение уровня способности у юнита

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

Primo

Пользователь
26 Авг 2016
66
0
В общем, сделал дамми с глобальной аурой. Сделал предмет, который должен повышать уровень способности этого дамми, что не происходит. Нужна помощь в решении данной проблемы.

Код:
	"ve_unit_damage_up"
	{
		// General
		//-------------------------------------------------------------------------------------------------------------
		"BaseClass"				"ability_datadriven"
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA"
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_FRIENDLY"
		"AbilityTextureName"			"crystal_maiden_brilliance_aura"
		"MaxLevel"						"5"
		
		// Special
		//-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"damage"		"5 10 20 30"
			}
			// Extra variables
			"02"
			{
				"var_type"			"FIELD_INTEGER"
				"global_radius"		"9000"
			}
		}
		
		// Data driven
		//-------------------------------------------------------------------------------------------------------------
		"Modifiers"
		{
			"modifier_ve_unit_damage_up"
			{
				"Passive"				"1"
				"IsPurgable"			"0"
				"IsHidden"				"1"
				"Aura"					"modifier_ve_unit_damage_up_mod"
				"Aura_Radius"			"%global_radius"
				"Aura_Teams"			"DOTA_UNIT_TARGET_TEAM_FRIENDLY"
				"Aura_Types"			"DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_CREEP"
				"States"
				{
					"MODIFIER_STATE_UNSELECTABLE"		"MODIFIER_STATE_VALUE_ENABLED"
					"MODIFIER_STATE_NO_HEALTH_BAR"		"MODIFIER_STATE_VALUE_ENABLED"
					"MODIFIER_STATE_INVULNERABLE"		"MODIFIER_STATE_VALUE_ENABLED"
					"MODIFIER_STATE_OUT_OF_GAME"		"MODIFIER_STATE_VALUE_ENABLED"
				}
				"Properties"
				{
					"MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"		"%damage"
				}
			}
			
			"modifier_ve_unit_damage_up_mod"
			{
				"Properties"
				{
					"MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"		"%damage"
				}
			}
		}
	}

Код:
	"item_book_upper_damage" 
	{
		"ID"         "1201"
		"AbilityBehavior"     "DOTA_ABILITY_BEHAVIOR_ITEM | DOTA_ABILITY_BEHAVIOR_NO_TARGET" 
		"BaseClass"      "item_datadriven"
		"Model"        "models/props_gameplay/red_box.vmdl" 
		"AbilityTextureName"   "crystal_maiden_brilliance_aura" 
		"ItemCost"            "5" 
		"ItemDroppable"        "1" 
		"ItemSellable"        "1" 
		"ItemKillable"        "0" 
		"ItemShareability"      "ITEM_NOT_SHAREABLE" 
		"ItemDeclarations"      "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS | DECLARE_PURCHASES_IN_SPEECH"
		"AbilityCooldown"        "1" // 
		"AbilityManaCost"        "15" 
		"Modifiers"
		{
			"modifier_item_book_upper_damage"
			{
				"Passive"			"1" 
				"IsHidden"			"1"
				
				"OnCreated" 
				{
					"RunScript"
					{
						"ScriptFile"		"ve_unit_upper.lua"
						"Function"			"ve_damage_script_setlevel" 
					}
				}
			}
		}
	}

Код:
function ve_damage_script_setlevel( keys )
	local hCaster = keys.caster
	local hUnit = Entities:FindByClassname(nil, "ve_dota_unit_upper")
	while not bFound do
		if hUnit then
			if hUnit:GetTeamNumber() == hCaster:GetTeamNumber() then
				local abilka = hUnit:FindAbilityByName("ve_unit_damage_up")
				local cLevel = abilka:GetLevel()
				abilka:SetLevel(4)
				bFound = true
			else
				hUnit = Entities:FindByClassname(hUnit, "ve_dota_unit_upper")
			end
		else
			bFound = true
		end
	end
end
 
Последнее редактирование модератором:
Primo, FindByClassName() вроде бы находит по BaseClass, то есть он ищет, например, "npc_dota_creature".
Тебе надо использовать просто FindByName(), но не забудь, что найдется таблица юнитов. Поэтому тебе нужно запустить цикл for i in Entities:FindByName() then и всем юнитам с этим именем делать Ability:SetLevel()
 
Последнее редактирование модератором:
Твой скрипт, как я понимаю, запускается единожды при покупке вещи?
 
В общем, не находит ve_dota_unit_upper (FindByClassname и FindByName возвращают nil)
Сам юнит создаётся через
Код:
CreateUnitByName( "ve_dota_unit_upper", pos_vector, true, nil, nil, DOTA_TEAM_GOODGUYS)

Код:
	"ve_dota_unit_upper"
	{
		"BaseClass"					"npc_dota_creature"
		"Model"						"models/development/invisiblebox.vmdl"
		"Ability1"					"ve_unit_damage_up"
		"AttackCapabilities"		"DOTA_UNIT_CAP_NO_ATTACK"
		"BountyXP"					"0"
		"MovementCapabilities"		"DOTA_UNIT_CAP_MOVE_NONE"
		"StatusHealth"				"5000"
		"TeamName"					"DOTA_TEAM_NEUTRALS"
		"MinimapIcon"				"minimap_treasure_chest"
		"MinimapIconSize"			"1"
	}
 
Последнее редактирование модератором:
Раз твой скрипт запускается единожды при покупке, то зачем тебе в нем блок "if else", который подразумевает неоднократное обращение?


Касательно твоего главного вопроса, о поиске имени: насколько я знаю, FindByName() ищет сущности на карте, блоки, а не те, что ты создаешь в процессе игры, используя lua. Создай глобалку и занеси туда handle своего моба. А по активации твоего скрипта обращайся из него к этой глобалке.
 
Последнее редактирование модератором:
Касательно твоего главного вопроса, о поиске имени: насколько я знаю, FindByName() ищет сущности на карте, блоки, а не те, что ты создаешь в процессе игры, используя lua. Создай глобалку и занеси туда handle своего моба. А по активации твоего скрипта обращайся из него к этой глобалке.

Если я правильно понял про глобальную переменную, то я пытался так делать. Всё равно nil.
Код:
dota_npc_ve_upper = CreateUnitByName( "ve_dota_unit_upper", pos_vector, true, nil, nil, DOTA_TEAM_GOODGUYS)
 
Последнее редактирование модератором:
[quote author=Primo link=topic=1063.msg5982#msg5982 date=1472224020]
Это проверки в цикле может? Чтобы его завершить при отрицательном результате условия.
Если я правильно понял про глобальную переменную, то я пытался так делать. Всё равно nil.
Код:
dota_npc_ve_upper = CreateUnitByName( "ve_dota_unit_upper", pos_vector, true, nil, nil, DOTA_TEAM_GOODGUYS)
[/quote]
Если у тебя в разных файлах используется глобальная переменная, то лучше пиши явным образом _G.var_name, и обращайся так же явным образом.
И проверь существует ли юнит на момент запуска усиления(может он пропал?).
Еще можешь проверить FindAllByName("name").
А если уж совсем не сработает, то делаешь костыль вот такой FindUnitsInRadius.
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1063.msg5983#msg5983 date=1472224561]
Если у тебя в разных файлах используется глобальная переменная, то лучше пиши явным образом _G.var_name, и обращайся так же явным образом.
[/quote]

Решило проблему.
Спасибо всем, кто помогал.
 
Дабы не засорять топик темами, решил написать сюда же еще один вопрос.

В общем, есть 3 способности, каждая из них имеет

Код:
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"damage"		"0 15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240 255 270 285 300 315 330 345 360"
			}
		}
Т.е. 25 уровней. Если попытаться запустить с этими 3 способностями, то игра крашится, а если же оставить только одну способность, то игра нормально запустится.
Логично предположить, что при наличии 3 способностей, каждая из которых имеет максимальный уровень 25, суммарно получается 75.
Вопрос, можно ли как-то обойти подобное ограничение?
 
Последнее редактирование модератором:
[quote author=Primo link=topic=1063.msg5985#msg5985 date=1472232824]
Дабы не засорять топик темами, решил написать сюда же еще один вопрос.

В общем, есть 3 способности, каждая из них имеет

Код:
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"damage"		"0 15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240 255 270 285 300 315 330 345 360"
			}
		}
Т.е. 25 уровней. Если попытаться запустить с этими 3 способностями, то игра крашится, а если же оставить только одну способность, то игра нормально запустится.
Логично предположить, что при наличии 3 способностей, каждая из которых имеет максимальный уровень 25, суммарно получается 75.
Вопрос, можно ли как-то обойти подобное ограничение?
[/quote]
Можно.
Код:
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"damage_increasing_per_level"		"15"
			}
		}
А вместо одного модификатора вешать стаки на него.
 
Последнее редактирование модератором:
Реклама: