Лесной крип на линии

Ошибку не выдает, просто не работает. Если дать, например, 1ый скилл гиро, то работает. Пишу я это в отдельном файле, ссылаюсь из юнита
Код:
"vscripts"          "dk_ai.lua"
Таймер для проверки хп, переменная pos осталась, я пробовал сделать каст на местность.
 
Последнее редактирование модератором:
[quote author=tasman208 link=topic=799.msg3492#msg3492 date=1460009872]
Ошибку не выдает, просто не работает. Если дать, например, 1ый скилл гиро, то работает. Пишу я это в отдельном файле, ссылаюсь из юнита
Код:
"vscripts"          "dk_ai.lua"
Таймер для проверки хп, переменная pos осталась, я пробовал сделать каст на местность.
[/quote]
В случае если ничего не пашет, а должно, добавь в скрипт парочку print'ов что бы узнать, вызывается ли он вообще.
 
Последнее редактирование модератором:
Я добавлял, все останавливается на строчке
Код:
 thisEntity:CastAbilityNoTarget(dragon_form, -1)
 
Если ты вызываешь это просто в отдельном скрипте, то что за переменная такая thisEntity, о которой нигде ничего не сказано?
 
Понятия не имею. Она нигде не объявляется, скорее всего это сам юнит. Факт в том, что с обычными скиллами работает, а с ультами нет
 
Ты неправильно думаешь:
если переменная берется из ниоткуда, то не надо ее оправдывать, она виновна!

Скинь нормально весь файл и код крипа.
И откуда ты вообще взял этот алгоритм?
 
Вот тут https://github.com/MNoya/Warchasers...chasers/scripts/vscripts/ai_tank_miniboss.lua

Код юнита
Код:
"dk_boss" 
	{

	    "BaseClass"       "npc_dota_creature"
	    "Model"         "models/heroes/dragon_knight/dragon_knight.vmdl" 
	    "ModelScale"      "1.6" 
	    "Level"         "100" 
	    "HealthBarOffset"    "140" 
	    "HasInventory"     "1" 
	    "UseNeutralCreepBehavior" 	"1"
	       
	    "Ability1"       "tidehunter_kraken_shell"
	    "Ability2"      	"neutral_spell_immunity"
	    "Ability3"      	"life_stealer_feast"
	    	"Ability4"      	"dragon_knight_elder_dragon_form"
 

	    "ArmorPhysical"     "50"
	    "MagicalResistance"   "100"
	    

	    "AttackCapabilities"  "DOTA_UNIT_CAP_MELEE_ATTACK"
	    "AttackDamageType"   "DAMAGE_TYPE_ArmorPhysical"
	    "AttackDamageMin"    "300.0"
	    "AttackDamageMax"    "350.0"
	    "AttackRate"      "0.8"
	    "AttackAnimationPoint" "0.1"
	    "AttackAcquisitionRange" "500"
	    "AttackRange"      "90"
	    
			"BountyXP"				"5000"		
	    "BountyGoldMin"     "5000"
	    "BountyGoldMax"     "6000"
	    
	    "BoundsHullName"    "DOTA_HULL_SIZE_HERO"
	    "RingRadius"      "70"
	    

	    "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
	    "MovementSpeed"     "325"
	    "MovementTurnRate"   "0.6"

	    "StatusHealth"     "3000"
	    "StatusHealthRegen"   "50"
	    "StatusMana"      "500"
	    "StatusManaRegen"    "100"
	    

	    "VisionDaytimeRange"  "1400"
	    "VisionNighttimeRange" "800"
	    

	    "TeamName"       "DOTA_TEAM_ANCIENTS"
	    "CombatClassAttack"   "DOTA_COMBAT_CLASS_ATTACK_BASIC"
	    "CombatClassDefend"   "DOTA_COMBAT_CLASS_DEFEND_STRONG"
	    "UnitRelationShipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
	    "vscripts"          "dk_ai.lua"
	    

	    "Creature"
	    {		
	        "DisableClumpingBehavior"    "1"
	        "AttachWearables"
	        {
	            "Wearable1" { "ItemDef" "63" }
	            "Wearable2" { "ItemDef" "64" }
	            "Wearable3" { "ItemDef" "65" }
	            "Wearable4" { "ItemDef" "66" }
	            "Wearable5" { "ItemDef" "67" }
	            "Wearable6" { "ItemDef" "68" }
	        }

	        "EquippedItems"
					{
  					"item1"  {  "Item"  "item_monkey_king_bar"  }
  					"item2"  {  "Item"  "item_eye_of_destiny"  }
					}
	    }
	}

Скрипт
Код:
function Spawn( entityKeyValues )
	dragon_form = thisEntity:FindAbilityByName("dragon_knight_elder_dragon_form")
	thisEntity:SetContextThink( "SteamtankThink", SteamtankThink , 1)
end



function SteamtankThink()
	local health = thisEntity:GetHealth() / thisEntity:GetMaxHealth()
	if health <= 0.50 then
		if dragon_form:IsFullyCastable() then
			thisEntity:CastAbilityNoTarget(dragon_form, -1)
		end
	end
	return 1
end
 
Последнее редактирование модератором:
М, вижу, откуда взял.
Да, она объявлена через принадлежность к классу. Я думал, ты скрипт вызываешь, а не привязываешь к юниту.
Кидай в следующий раз не кусочки а целиком.

Так и не понял, зачем тебе таймер, попробуй так:


Код:
function Spawn( entityKeyValues )
	local dragon_form = thisEntity:FindAbilityByName("dragon_knight_elder_dragon_form")

	local health = thisEntity:GetHealth() / thisEntity:GetMaxHealth()

	if health <= 0.50 then
		if dragon_form:IsFullyCastable() then
			thisEntity:CastAbilityNoTarget(dragon_form, -1)
		end
	end
end
 
Последнее редактирование модератором:
Не сработало. Таймер для получения текущего хп, функция запускается только 1 раз в начале игры. И без таймера у него хп всегда 100%
 
Ааа, это же постоянный таймер, а не единовременный. Понял.


Ну, не знаю, у меня тоже какие-то абилки не выходило кастовать и я клал болт через 10 минут, ибо не было времени разбираться.
 
Хорошее решение =) но я нашел в чем дело. Все заработало.
 
Тут приянто решение выкладывать, дабы потом можно было на него сослаться при ответе другим.
 
Я думал, тут не любят давать готовое. =)
В способности героя нужно изменить строку
Код:
"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_NO_TARGET"
Добавив туда
Код:
DOTA_ABILITY_BEHAVIOR_IMMEDIATE
Вот код переделанной ульты дк
Код:
"dragon_knight_elder_dragon_form"
	{
		// General
		//-------------------------------------------------------------------------------------------------------------
		"ID"							"5229"							// unique ID number for this ability. Do not change this once established or it will invalidate collected stats.
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
		"AbilityType"					"DOTA_ABILITY_TYPE_ULTIMATE"
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_YES"
		"FightRecapLevel"				"2"

		// Time		
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCooldown"				"115.0 115.0 115.0"

		// Cost
		//-------------------------------------------------------------------------------------------------------------
		"AbilityManaCost"				"50 50 50"		

		// Stats
		//-------------------------------------------------------------------------------------------------------------
		"AbilityModifierSupportValue"	"0.35"	// Attacks are primarily about the damage

		// Special
		//-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"					"FIELD_FLOAT"
				"duration"					"60.0 60.0 60.0"
			}
			"02"
			{
				"var_type"					"FIELD_INTEGER"
				"bonus_movement_speed"		"25 25 25"
			}
			"03"
			{
				"var_type"					"FIELD_INTEGER"
				"bonus_attack_range"		"372 372 372"
			}
			"05"
			{
				"var_type"					"FIELD_INTEGER"
				"corrosive_breath_damage"	"20 20 20"
			}
			"06"
			{
				"var_type"					"FIELD_FLOAT"
				"corrosive_breath_duration"	"5.0 5.0 5.0"
			}
			"07"
			{
				"var_type"					"FIELD_INTEGER"
				"splash_radius"				"150 225 300"
			}
			"08"
			{
				"var_type"					"FIELD_INTEGER"
				"splash_damage_percent"		"100 75 50"
			}
			"09"
			{
				"var_type"						"FIELD_INTEGER"
				"frost_bonus_movement_speed"	"-30 -30 -30"
			}
			"10"
			{
				"var_type"						"FIELD_INTEGER"
				"frost_bonus_attack_speed"		"-20 -20 -20"
			}
			"11"
			{
				"var_type"						"FIELD_FLOAT"
				"frost_duration"				"3.0 3.0 3.0"
			}
			"12"
			{
				"var_type"					"FIELD_FLOAT"
				"frost_aoe"					"250"
			}
			
		}
	}
 
Последнее редактирование модератором:
Появилась новая проблема. Нужно, чтобы он кастовал ульт, если в радиусе 900 есть хотябы 1 герой. Пишу вот так
Код:
function ckthink()
	local health = thisEntity:GetHealth() / thisEntity:GetMaxHealth()  
	local units = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 900, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false)
	print(units)
	if units ~= nil then 
		if health <= 0.50 then
			if ability:IsFullyCastable() then
				thisEntity:CastAbilityNoTarget(ability, -1)
			end
		end
	end
	return 1
end
И даже если рядом с ним никого нет, print(units) выдает разные значения
 
Последнее редактирование модератором:
Тебе надо не таблицу проверять, а ее элементы.

Насчет готовенького: готовенькое и не дают, если его нет. А если есть, дают ссылку .
 
Действительно, немного магии и все получилось)
Код:
function ckthink()
	local health = thisEntity:GetHealth() / thisEntity:GetMaxHealth()
	local units = FindUnitsInRadius( thisEntity:GetTeam(), thisEntity:GetOrigin(), nil, 900, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO, FIND_FARTHEST, false )  
	if health <= 0.50 then
		for _,unit in pairs(units) do
			if unit:IsRealHero() == true then
				if ability:IsFullyCastable() then
					thisEntity:CastAbilityNoTarget(ability, -1)
				end
			end
		end
	end
	return 1
end
 
Последнее редактирование модератором:
Реклама: