Убить ентити при отмене чаннелинга

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Ребят, помогите, мне нужно, чтобы при отмене или сбивании чаннелинга призванное существо умирало, но я не понимаю, как это реализовать, пытался делать так:
Код:
function OnChannelInterrupted()
		local randomname = Entities:FindByName(nil, "npc_randomname")
		if randomname == npc_randomname then
			randomname:ForceKill(false)
		print("Kill Randomname")
end
И просто вот так:
Код:
function OnChannelInterrupted()
		local randomname = Entities:FindAllByName("npc_randomname")
		randomname:ForceKill(false)
		print("Kill Randomname")
end
Но ничего не выходит, в абилке прописал все вот так:
Код:
"RandomNameAbility"
  {
    "BaseClass"           "ability_datadriven"
    "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
    "AbilityTextureName"      "RandomNameAbility"
    "AbilityCastPoint"       "0.0 0.0 0.0 0.0"
    "AbilityCooldown"        "40.0 40.0 40.0 40.0"
    "AbilityManaCost"        "100"
    "AbilityCastRange"       "400"
    "AbilityChannelTime"      "15.0"
    "AbilityChannelledManaCostPerSecond" "50 45 40 35"

    "AbilitySpecial"
    {
      "01"
      {
        "var_type"       "FIELD_INTEGER"
        "duration"       "15"
      }
      "02"
      {
        "var_type"       "FIELD_INTEGER"
        "durationcast"     "15"
      }
    }
    "OnSpellStart"
    {
      "SpawnUnit"
      {
        "UnitName"     "npc_randomname"
        "Target"      "POINT"
        "Duration"     "%duration"
        "UnitCount"     "1"
        "UnitLimit"     "0"
        "GrantsGold"    "0"
        "GrantsXP"     "0"
        "SpawnRadius"    "10"
        "OnSpawn"
        {
          "ApplyModifier"
          {
            "ModifierName"   "modifier_phased"
            "Target"      "TARGET"
            "Duration"     "0.03"
          }
        }
      }
    }
    "OnChannelInterrupted"
    {
      "RunScript"
      {
        "ScriptFile"    "heroes/blabla/randomname.lua"
        "Function"     "OnChannelInterrupted"
      }
    }
  }

(Если что, название скиллов, скрипта, папок и непесей здесь я поменял, чтобы оставалось в секретике, все равно это ничего не меняет)
 
Последнее редактирование модератором:
Делай спавн в луа
И проверяй так
Код:
Timers:CreateTimer(0.03, function()
if ability:IsChenelling() then
 ---делай что нужно
return 0.03
else 
 ---удалить юнит
return nil 
end
End)

проверь ченнелинг в документации
 
Я где-то давно видел что OnChannelInterrupt просто не работает.

На тот момент (ориентировочно полгода) это было достоверной инфой.

Я бы сделал в kv, отловил через скрипт кастера и убил.

А еще попробуй self:ForceKill(false)
 
Я не смотрел твой KV. Но вижу ошибку в луа.
Код:
function OnChannelInterrupted()
   local randomname = Entities:FindByName(nil, "npc_randomname")
   if randomname == npc_randomname then
     randomname:ForceKill(false)
   print("Kill Randomname")
end
randomname - таблица. Её нужно перебирать, каждый пункт.

Код:
function OnChannelInterrupted()
   local randomname = Entities:FindByName(nil, "npc_randomname")
   for k, v in pairs(randomname) do --[[ перебираем в цикле всю таблицу, по очереди каждый пункт. k - грубо говоря, номер(в данном случае) строки, v - значение.]]
     if v == npc_randomname then
      v:ForceKill(false)
    print("Kill Randomname")
    end
   end
end
Чето у тебя велосипед какой-то, всё проще делается на самом деле.
 
Последнее редактирование модератором:
Вы где-то инициализируете объект npc_randomname?
А то тут:
"if randomname == npc_randomname then "
Мне не понятно, что вы сравниваете: два объекта или же две строки?)
 
Последнее редактирование модератором:
он таблицу сравнивает с юнитов, странно что вообще всё это дело не крашится

перепиши заново
 
Так а кто сказал, что npc_randomname - эт у него юнит? Я вот не вижу, что это за объект такой у него.
 
Илья, дыа, это - юнит, который должен умирать, когда отменяется каст, простите за недопонимание.

Эх, господи, что я делаю
Код:
function randomnamedie(event)
	local ability = GetAbility()
  local randomname = Entities:FindAllByName("npc_randomname")
  if ability:IsChanneling()
  	return nil
  else
  	if randomname then
			for i = 1, #randomname do
				randomname[i]:ForceKill(false)
			end
		end
	end
end
 
Последнее редактирование модератором:
Метод GetAbility() подразумевает под собой вызов его у объекта, что может иметь ability.
Ты как бы говоришь, к примеру, девчонке дать тебе её номер мобильника. Но в твоем коде:
local ability = GetAbility()
ты про себя это делаешь, т.е. ни у кого не спрашиваешь номер мобильника.
Любой геттер (метод Get) подразумевает вызов его у того, кто тебе это "дает", сможет дать.
 
Последнее редактирование модератором:
Илья, я еще через event.ability пробовал. И через local caster = event.caster; local ability = caster:GetAbility()
 
Код:
function OnChannelInterrupted(event)
		local caster = event.caster
        local ability = event.ability
		caster:ForceKill()
end

почему без проверки убиваю? Потому что событие стоит что каст как бы уже отменён или сбит.
 
Так ему разве кастера надо убивать?

Вообще, скидывайте полный код, а то будто дают кусок пластилина, просят прямоугольник из него сделать, делаешь, а затем этот кусок используют в качестве ноги какого-нибудь животного. И ты бы сделал ногу, но тебя то просили сделать прямоугольник.
 
Эх, ладно, ловите все моё(и да, убивать надо призванного патронуса):
Код:
"PatronusCharmPotter"
  {
    "BaseClass"           "ability_datadriven"
    "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
    "AbilityTextureName"      "patronuspotter"
    "AbilityCastPoint"       "0.0 0.0 0.0 0.0"
    "AbilityCooldown"        "40.0 40.0 40.0 40.0"
    "AbilityManaCost"        "100"
    "AbilityCastRange"       "400"
    "AbilityChannelTime"      "15.0"
    "AbilityChannelledManaCostPerSecond" "50 45 40 35"

    "AbilitySpecial"
    {
      "01"
      {
        "var_type"       "FIELD_INTEGER"
        "duration"       "15"
      }
      "02"
      {
        "var_type"       "FIELD_INTEGER"
        "durationcast"     "15"
      }
    }
    "OnSpellStart"
    {
      "SpawnUnit"
      {
        "UnitName"     "npc_patronuspotter"
        "Target"      "POINT"
        "Duration"     "%duration"
        "UnitCount"     "1"
        "UnitLimit"     "0"
        "GrantsGold"    "0"
        "GrantsXP"     "0"
        "SpawnRadius"    "10"
        "OnSpawn"
        {
          "ApplyModifier"
          {
            "ModifierName"   "modifier_phased"
            "Target"      "TARGET"
            "Duration"     "0.03"
          }
        }
      }
    }
    "ThinkInterval" "1.0"
    "OnIntervalThink"
    {
      "RunScript"
      {
        "ScriptFile"  "heroes/harry/patronuspotter.lua"
        "Function"    "patronusdie"
      }
    }
  }
  "patronuspotter_runaway"
  {
    "BaseClass"           "ability_datadriven"
    "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA"
    "AbilityUnitTargetTeam"     "DOTA_UNIT_TARGET_TEAM_ENEMY"
    "AbilityUnitTargetType"     "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_BASIC"
    "AbilityTextureName"      "patronuspotter"
    "AbilityCastPoint"       "0"
    "AbilityCooldown"        "0"
    "AbilityManaCost"        "0"
    "AbilityCastRange"       "300"
    "MaxLevel"           "1"

    "Modifiers"
    {
      "runaway_modifier"
      {
        "Passive"      "1"
        "IsHidden"     "0"
        "Aura"       "Aurarunaway"
        "Aura_Radius"    "300"
        "Aura_Teams"    "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "Aura_Types"    "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_BASIC"
        "Aura_ApplyToCaster" "0"
        "States"
        {
          "MODIFIER_STATE_NO_HEALTH_BAR"     "MODIFIER_STATE_VALUE_ENABLED"
          "MODIFIER_STATE_FLYING"         "MODIFIER_STATE_VALUE_ENABLED"
          "MODIFIER_STATE_NO_UNIT_COLLISION"   "MODIFIER_STATE_VALUE_ENABLED"
        }
      }
      "rubawayupgrade"
      {
        "OnOwnerSpawned"
        {
          "LevelUpAbility"
          {
            "Target"     "CASTER"
            "AbilityName"  "patronuspotter_runaway"
          }
        }
      }
      "Aurarunaway"
      {
        "IsDebuff" "1"
        "IsPurgable" "0"
        "ThinkInterval" "0.6"
        "OnIntervalThink"
        {
          "Knockback"
          {
            "Target"        "TARGET"
            "Center"        "CASTER"
            "Radius"        "300"
            "Distance"       "100"
            "Duration"       "0.5"
            "Height"        "10"
            "IsFixedDistance"    "0"
            "ShouldStun"      "1"  
          }
        }
      }
    }
  }

Код:
"npc_patronuspotter"
	{										
		// General
		//----------------------------------------------------------------
		"Model"						"models/heroes/elder_titan/ancestral_spirit.vmdl"	// Model.
		"BaseClass"					"npc_dota_creature"
		"SoundSet"					"0"			// Name of sound set.
		"Level"						"1"
		"ModelScale"				"1.0"
		"ConsideredHero"			"1"
		"IsAncient"					"1"

		// Abilities
		//----------------------------------------------------------------
		"Ability1"					"patronuspotter_runaway"

		// Armor
		//----------------------------------------------------------------
		"ArmorPhysical"				"0"			// Physical protection.

		// Attack
		//----------------------------------------------------------------
		"AttackCapabilities"		"DOTA_UNIT_CAP_NO_ATTACK"
		"AttackDamageMin"			"0"			// Damage range min.
		"AttackDamageMax"			"0"			// Damage range max.	
		"AttackRate"				"1.0"		// Speed of attack.
		"AttackAnimationPoint"		"0.0"		// Normalized time in animation cycle to attack.
		"AttackAcquisitionRange"	"0"			// Range within a target can be acquired.
		"AttackRange"				"0"			// Range within a target can be attacked.
		"ProjectileModel"			""			// Particle system model for projectile.
		"ProjectileSpeed"			"0"			// Speed of projectile.		  

		// Bounds
		//----------------------------------------------------------------
		"BoundsHullName"			"DOTA_HULL_SIZE_SMALL"			// Hull type used for navigation/locomotion.


		// Movement
		//----------------------------------------------------------------
		"MovementCapabilities"		"DOTA_UNIT_CAP_MOVE_GROUND"			// Type of locomotion - ground, air
		"MovementSpeed"				"200"			// Speed
		"MovementTurnRate"			"0.5"		// Turning rate.

		// Status
		//----------------------------------------------------------------
		"StatusHealth"				"100"		// Base health.
		"StatusHealthRegen"			"0.0"		// Health regeneration rate.	
		
		// Vision
		//----------------------------------------------------------------
		"VisionDaytimeRange"		"0"		// Range of vision during day light.
		"VisionNighttimeRange"		"0"		// Range of vision at night time.

		// Team
		//----------------------------------------------------------------
		"TeamName"					"DOTA_TEAM_NEUTRALS"							// Team name.
		"CombatClassAttack"			"DOTA_COMBAT_CLASS_ATTACK_BASIC"
		"CombatClassDefend"			"DOTA_COMBAT_CLASS_DEFEND_BASIC"
		"UnitRelationshipClass"		"DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
	}

Код:
function patronusdie(event)
	local ability = GetAbility()
  local patronus = Entities:FindAllByName("npc_patronuspotter")
  if ability:IsChanneling()
  	return nil
  else
  	if patronus then
			for i = 1, #patronus do
				patronus[i]:ForceKill(false)
			end
		end
	end
end
 
Последнее редактирование модератором:
:D

То есть у тебя есть юнит, который с определенным интервалом (которые по идеи не работают, если не ошибаюсь) делает некую проверку и убивает себя? Это тебе нужно?
 
Илья, нии, время жизни его работает нормально. Он умирает через 15 секунд, как раз время каста. Мне нужно, чтобы если кастера застанили(например), то призванное существо умирало.
 
Аааааа. Тебе в таком случае, надо передать owner`a твоего юнита в твой метод "убийства" и от этого овнера получить его абилку. А уже её проверять.
 
Последнее редактирование модератором:
А как он у тебя умирает через 15 секунд, елси тут указана 1?

Код:
    "ThinkInterval" "1.0"
    "OnIntervalThink"
    {
      "RunScript"
      {
        "ScriptFile"  "heroes/harry/patronuspotter.lua"
        "Function"    "patronusdie"
      }
    }
 
Последнее редактирование модератором:
Реклама: