Не вешается модификатор.

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Привет профи. Подскажите дурачку, что не так, пожалуйста.
В общем пытаюсь написать модификатор на союзника, который давал бы бонусвижн, но модификатор просто не появляется.
tracking_lua.lua:
Код:
tracking_lua = class({})

LinkLuaModifier("modifier_tracking_lua", "modifier_tracking_lua", LUA_MODIFIER_MOTION_NONE)

function tracking_lua:GetBehavior()
	return DOTA_ABILITY_BEHAVIOR_UNIT_TARGET
end

function tracking_lua:GetAbilityTargetTeam()
	return DOTA_UNIT_TARGET_TEAM_FRIENDLY and DOTA_UNIT_TARGET_TEAM_ENEMY
end

function tracking_lua:GetAbilityTargetType()
	return DOTA_UNIT_TARGET_HERO
end

function tracking_lua:GetManaCost(iLevel)
	local ability = keys.ability
	return ability:GetLevelSpecialValueFor("AbilityManaCost", ability:GetLevel() - 1)
end

function tracking_lua:GetCooldown(iLevel)
	local ability = keys.ability
	return ability:GetLevelSpecialValueFor("AbilityCooldown", ability:GetLevel() - 1)
end

function tracking_lua()
	local caster = keys.caster
	local target = keys.target
	local ability = keys.ability
	local duration = ability:GetLevelSpecialValueFor("duration", ability:GetLevel() - 1)

	if target:GetAbilityTargetTeam() == DOTA_UNIT_TARGET_TEAM_FRIENDLY then
		target:AddNewModifier(caster:GetCaster(), ability, "modifier_tracking_lua", { duration = duration })
	else return end
end

modifier_tracking_lua.lua:
Код:
modifier_tracking_lua = class({})

function modifier_tracking_lua:OnCreated(kv)
	self.bonusvision = self:GetAbility():GetSpecialValueFor( "bonusvision" )
end

function modifier_tracking_lua:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_BONUS_DAY_VISION
	}
	return funcs
end

function modifier_tracking_lua:GetBonusDayVision()
	return self.bonusvision
end

function modifier_tracking_lua:GetTexture()
  return "antimage_mana_break"
end

function modifier_tracking_lua:IsHidden()
	return 0
end

npc_abilites_custom:
Код:
"DOTAAbilities"
{
	"tracking_lua"
	{
		"BaseClass"       		"ability_lua"
		"ScriptFile"					"tracking_lua"
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_ENEMY | DOTA_UNIT_TARGET_TEAM_FRIENDLY"
		"AbilityUnitTargetType"			"DOTA_UNIT_TARGET_HERO"
		"AbilityTextureName"			"antimage_mana_break"
		"MaxLevel" 						"4"
		"AbilityCooldown"				"7.0 5.0 3.0 1.0"
		"AbilityManaCost"				"100 90 80 70"
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"duration"			"5.0 7.0 9.0 11.0"
			}
			"02"
			{
				"var_type"			"FIELD_FLOAT"
				"bonusvision"		"200"
			}
		}
	}
	
}
 
Последнее редактирование модератором:
почему бы не прописать модификатор в KV скрипте, зачем в луа он ?
 
Slavko, я сейчас в луа пытаюсь разобраться, поэтому и хочу написать способность на нём.
 
Кстати я попытался что то поменять, но безуспешно:
tracking_lua.lua
Код:
tracking_lua = class({})

LinkLuaModifier("modifier_tracking_lua", "modifier_tracking_lua", LUA_MODIFIER_MOTION_NONE)

function tracking_lua:OnSpellStart()
	local duration = self:GetLevelSpecialValueFor("duration", self:GetLevel() - 1)
	local target = self:GetCursorTarget()

	if target:GetTeamNumber() == DOTA_UNIT_TARGET_TEAM_FRIENDLY then
		target:AddNewModifier(self:GetCaster(), self, "modifier_tracking_lua", { duration = duration })
	else return end
end

modifier_tracking_lua.lua
Код:
modifier_tracking_lua = class({})

function modifier_tracking_lua:OnCreated(kv)
	self.bonusvision = self:GetAbility():GetSpecialValueFor( "bonusvision" )
end

function modifier_tracking_lua:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_BONUS_DAY_VISION
	}
	return funcs
end

function modifier_tracking_lua:GetBonusDayVision()
	return self.bonusvision
end

function modifier_tracking_lua:GetTexture()
  return "antimage_mana_break"
end

function modifier_tracking_lua:IsHidden()
	return 0
end
 
Последнее редактирование модератором:
На пример и забудь про keys в lua
Код:
LinkLuaModifier ("modifier_infinity_black_hole_thinker", "heroes/hero_enigma/modifier_infinity_black_hole_thinker.lua", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier ("modifier_infinity_black_hole", "heroes/hero_enigma/modifier_infinity_black_hole.lua", LUA_MODIFIER_MOTION_NONE)
infinity_black_hole = class ({})

function infinity_black_hole:GetCastRange (vLocation, hTarget)
  return self.BaseClass.GetCastRange (self, vLocation, hTarget)
end

function infinity_black_hole:GetAOERadius ()
  return 450
end

function infinity_black_hole:GetCooldown (nLevel)
  return self.BaseClass.GetCooldown (self, nLevel)
end

function infinity_black_hole:GetManaCost (hTarget)
  return self.BaseClass.GetManaCost (self, hTarget)
end

function infinity_black_hole:GetBehavior ()
  return DOTA_ABILITY_BEHAVIOR_AOE + DOTA_ABILITY_BEHAVIOR_POINT + DOTA_ABILITY_BEHAVIOR_CHANNELLED
end

function infinity_black_hole:GetChannelTime()
  return 4
end

function infinity_black_hole:OnSpellStart ()
  local caster = self:GetCaster ()
  local point = self:GetCursorPosition ()
  local team_id = caster:GetTeamNumber ()
  local thinker = CreateModifierThinker (caster, self, "modifier_infinity_black_hole_thinker", {}, point, team_id, false)
  AddFOWViewer (caster:GetTeam (), point, 450, 4, false)
  GridNav:DestroyTreesAroundPoint(point, 500, false)
  if caster:HasScepter () then
    caster:AddNewModifier(caster, self, "modifier_invulnerable", {duration = 4})
  end
end







Код:
modifier_infinity_black_hole_thinker = class ( {})

function modifier_infinity_black_hole_thinker:OnCreated(event)
  if IsServer() then
    local thinker = self:GetParent()
    local ability = self:GetAbility()
    self.startup_time = ability:GetSpecialValueFor("move_tick_rate")
    self.target = self:GetCaster():GetCursorPosition()
    self.duration = ability:GetSpecialValueFor("duration")
    self.speed = ability:GetSpecialValueFor("pull_speed")
    self.radius = ability:GetSpecialValueFor("far_radius")
    self.vision_radius = ability:GetSpecialValueFor("vision_radius")
    local thinker_pos = thinker:GetAbsOrigin()
    self:StartIntervalThink (self.startup_time)
    self.soundName = "chw.black_hole_loop_01"
    StartSoundEvent(self.soundName, self:GetAbility():GetCaster())
    local bhParticle1 = ParticleManager:CreateParticle ("particles/black_hole_update/blackhole_fallback.vpcf", PATTACH_WORLDORIGIN, thinker)
    thinker:EmitSound ("enigma_enig_ability_black_01")
    ParticleManager:SetParticleControl(bhParticle1, 0, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl(bhParticle1, 1, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl(bhParticle1, 2, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl(bhParticle1, 3, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl(bhParticle1, 6, Vector (500, 500, 65))
    ParticleManager:SetParticleControl(bhParticle1, 7, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl(bhParticle1, 8, thinker_pos + Vector (0, 0, 65))
    ParticleManager:SetParticleControl (bhParticle1, 9, thinker_pos + Vector (0, 0, 65))
    self:AddParticle( bhParticle1, false, false, -1, false, true )
    ScreenShake(thinker:GetOrigin (), 100, 100, 6, 9999, 0, true)
  end
end

function modifier_infinity_black_hole_thinker:OnIntervalThink()
  local caster = self:GetAbility():GetCaster()
  local target_location = self.target
  local ability = self:GetAbility()
  if caster:HasAbility("enigma_midnight_pulse_new") then
    midnightpulse = caster:FindAbilityByName("enigma_midnight_pulse_new")
    midnightpulse_damage = midnightpulse:GetLevelSpecialValueFor( "damage_per_tick" , ability:GetLevel() - 1 )/100
  end
  -- Ability variables
  local speed = ability:GetSpecialValueFor("pull_speed")/10
  local radius = ability:GetSpecialValueFor("far_radius")

  -- Targeting variables
  local target_teams = ability:GetAbilityTargetTeam() 
  local target_types = ability:GetAbilityTargetType() 
  local target_flags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES

  -- Units to be caught in the black hole
  local units = FindUnitsInRadius(caster:GetTeamNumber(), target_location, nil, radius, target_teams, target_types, target_flags, 0, false)

  -- Calculate the position of each found unit in relation to the center
  for i,unit in ipairs(units) do
    local unit_location = unit:GetAbsOrigin()
    local vector_distance = target_location - unit_location
    local distance = (vector_distance):Length2D()
    local direction = (vector_distance):Normalized()
    -- If the target is greater than 40 units from the center, we move them 40 units towards it, otherwise we move them directly to the center
    if distance >= 40 then
      unit:SetAbsOrigin(unit_location + direction * speed)
    else
      unit:SetAbsOrigin(unit_location + direction * distance)
    end
    unit:AddNewModifier(caster, ability, "modifier_infinity_black_hole", {duration = 0.2})
    local primary_damage = ability:GetSpecialValueFor("damage")
    local damage_percent = ability:GetSpecialValueFor("damage_perc")/100
    local damage = ((unit:GetMaxHealth()*damage_percent) + primary_damage)/10
    if caster:HasScepter() and caster:HasAbility("enigma_midnight_pulse_new") then
      damage = ((unit:GetMaxHealth()*damage_percent) + primary_damage + (unit:GetMaxHealth()*midnightpulse_damage))/10
    end
    ApplyDamage({victim = unit, attacker = caster, ability = ability, damage = damage, damage_type = DAMAGE_TYPE_PURE})
  end
  if not self:GetAbility():IsChanneling() then
    StopSoundEvent(self.soundName, caster)
    EmitSoundOn("Hero_Enigma.Black_Hole.Stop", self:GetAbility():GetCaster())
    for i,unit in ipairs(units) do
      FindClearSpaceForUnit(unit, unit:GetAbsOrigin(), false)
    end
    self:Destroy()
  end
end

function modifier_infinity_black_hole_thinker:CheckState()
  if self.duration then
    return {[MODIFIER_STATE_PROVIDES_VISION] = true}
  end
  return nil
end



Код:
modifier_infinity_black_hole = class ( {})

function modifier_infinity_black_hole:IsHidden()
  return false
end

function modifier_infinity_black_hole:IsPurgable()
  return false
end

function modifier_infinity_black_hole:IsDebuff ()
  return true
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:IsStunDebuff ()
  return true
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:GetEffectName ()
  return "particles/generic_gameplay/generic_stunned.vpcf"
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:GetEffectAttachType ()
  return PATTACH_OVERHEAD_FOLLOW
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:DeclareFunctions ()
  local funcs = {
    MODIFIER_PROPERTY_OVERRIDE_ANIMATION,
  }

  return funcs
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:GetOverrideAnimation (params)
  return ACT_DOTA_FLAIL
end

--------------------------------------------------------------------------------

function modifier_infinity_black_hole:CheckState ()
  local state = {
    [MODIFIER_STATE_STUNNED] = true,
  }

  return state
end
 
Последнее редактирование модератором:
Adam Smith, Adam Smith, спасибо, а почему нельзя использовать keys не ответите?
 
[quote author=I_GRIN_I link=topic=910.msg4360#msg4360 date=1463760952]
Adam Smith, Adam Smith, спасибо, а почему нельзя использовать keys не ответите?
[/quote]
Так как ты их будешь юзать если их нет?
Есть вот это:
Код:
function modifier_bynder_rim:OnTakeDamage(params)
  if self:GetParent () == params.unit then
    self.damage = self.damage + params.damage
    self:GetParent ():SetHealth(self:GetParent ():GetHealth() + params.damage)
    self:GetParent ():AddNewModifier (self:GetCaster (), self:GetAbility(), "modifier_bynder_rim_damage_bonus", nil )
    local mod = self:GetParent ():FindModifierByName("modifier_bynder_rim_damage_bonus")
    local stacks = math.floor(self.damage)
    mod:SetStackCount(stacks)
    local RemovePositiveBuffs = false
    local RemoveDebuffs = true
    local BuffsCreatedThisFrameOnly = false
    local RemoveStuns = true
    local RemoveExceptions = false
    self:GetParent():Purge( RemovePositiveBuffs, RemoveDebuffs, BuffsCreatedThisFrameOnly, RemoveStuns, RemoveExceptions)
  end
end
 
Последнее редактирование модератором:
Что бы были кейсы. Это просто название параметра, а в луа принято использовать название входной таблицы как "ключи". Или событие(event).
function myfunction(KEYS)
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=910.msg4367#msg4367 date=1463767507]
Что бы были кейсы. Это просто название параметра, а в луа принято использовать название входной таблицы как "ключи". Или событие(event).
function myfunction(KEYS)
[/quote]
Я имел ввиду ключи передаваемые из KV
 
Последнее редактирование модератором:
Если ты про эту строчку

function modifier_tracking_lua:OnCreated(kv)

То можно так называть таблицу. Я, например, обычно называю табличку data.
 
Реклама: