Заряды

Adam Smith

Друзья CG
4 Окт 2014
473
2
не понимаю почему не работают заряды, помогите плиз)
Код:
LinkLuaModifier( "modifier_pudge_sacrifice", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_pudge_sacrifice_visible", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_pudge_sacrifice_charge", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_pudge_sacrifice_charge_cooldown", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
pudge_sacrifice = class({})

function pudge_sacrifice:GetIntrinsicModifierName() 
	return "modifier_pudge_sacrifice_visible"
end

function pudge_sacrifice:CastFilterResultTarget( hTarget )
	if IsServer() then
		if self:GetCaster():HasScepter() then
			if not self:GetCaster():HasModifier("modifier_pudge_sacrifice_charge") then
				return UF_FAIL_CUSTOM
			end
		end

		local nResult = UnitFilter( hTarget, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, self:GetCaster():GetTeamNumber() )
		if nResult ~= UF_SUCCESS then
			return nResult
		end
	end
	return UF_SUCCESS
end

function pudge_sacrifice:GetCustomCastErrorTarget( hTarget )
	if IsServer() then
		if self:GetCaster():HasScepter() then
			if not self:GetCaster():HasModifier("modifier_pudge_sacrifice_charge") then
				return "#dota_hud_error_charges"
			end
		end
	end
	return ""
end

function pudge_sacrifice:GetCooldown( nLevel )
	if self:GetCaster():HasScepter() then
		return 0
	end

	return self.BaseClass.GetCooldown( self, nLevel )
end

function pudge_sacrifice:GetConceptRecipientType()
	return DOTA_SPEECH_USER_ALL
end

function pudge_sacrifice:SpeakTrigger()
	return DOTA_ABILITY_SPEAK_CAST
end

function pudge_sacrifice:GetChannelTime()
	self.hero_duration = self:GetSpecialValueFor( "sacrifice_duration" )
	return self.hero_duration
end

function pudge_sacrifice:OnAbilityPhaseStart()
	if IsServer() then
		self.hVictim = self:GetCursorTarget()
		if self:GetCaster():HasScepter() then
			if self:GetCaster():HasModifier("modifier_pudge_sacrifice_charge") then
				local mod_table = self:GetCaster():FindAllModifiers()
				for i = 1, #mod_table do
					local mods = mod_table[i]
					if mods:GetName() == "modifier_pudge_sacrifice_charge" then
						self.charge = mods
						break
					end
				end
				self.charge:Destroy()
				local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_visible")
				mod_visible:SetStackCount(mod_visible:GetStackCount() - 1)
				return true
			else
				return false
			end
		end
	end
	return true
end

function pudge_sacrifice:OnSpellStart()
	if self.hVictim == nil then
		return
	end
	if self.hVictim:TriggerSpellAbsorb( self ) then
		self.hVictim = nil
		self:GetCaster():Interrupt()
	else
		self.hVictim:AddNewModifier( self:GetCaster(), self, "modifier_pudge_sacrifice", { duration = self:GetChannelTime() } )
		self.hVictim:Interrupt()
	end
end

function pudge_sacrifice:OnChannelFinish( bInterrupted )
	if self.hVictim ~= nil then
		self.hVictim:RemoveModifierByName( "modifier_pudge_sacrifice" )
	end
end

modifier_pudge_sacrifice_visible = class({})

function modifier_pudge_sacrifice_visible:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_MULTIPLE
end

function modifier_pudge_sacrifice_visible:IsHidden() 
	if IsServer() then
		if self:GetCaster():HasScepter() then
			return false
		end
	end
	return true
end

function modifier_pudge_sacrifice_visible:IsPurgable()
	return false
end

function modifier_pudge_sacrifice_visible:OnCreated()
	if IsServer() then
		self:StartIntervalThink(0.5)
	end
end

function modifier_pudge_sacrifice_visible:OnIntervalThink()
	if IsServer() then
		if self:GetParent():HasScepter() then
			if not self:GetParent():HasModifier("modifier_pudge_sacrifice_charge") then
				self:GetParent():AddNewModifier(self:GetParent(), self:GetAbility(), "modifier_pudge_sacrifice_charge", nil)
				self:GetParent():AddNewModifier(self:GetParent(), self:GetAbility(), "modifier_pudge_sacrifice_charge", nil)
				self:SetStackCount(2)
			end
		end
	end
end

modifier_pudge_sacrifice_charge = class({})

function modifier_pudge_sacrifice_charge:RemoveOnDeath()
	return false
end

function modifier_pudge_sacrifice_charge:IsPurgable()
	return false
end

function modifier_pudge_sacrifice_charge:IsBuff()
	return true
end

function modifier_pudge_sacrifice_charge:OnDestroy()
	if IsServer() then
		local abil = self:GetAbility()
		local cooldown = abil:GetCooldown(abil:GetLevel())
		self:GetParent():AddNewModifier(self:GetParent(), abil, "modifier_pudge_sacrifice_charge_cooldown", {duration = cooldown})
		--self:StartChargeCooldown(abil, cooldown)
	end
end

function modifier_pudge_sacrifice_charge:StartChargeCooldown(abil, cooldown)
	if IsServer() then
	end
end

function modifier_pudge_sacrifice_charge:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_PERMANENT
end

modifier_pudge_sacrifice_charge_cooldown = class({})

function modifier_pudge_sacrifice_charge_cooldown:RemoveOnDeath()
	return false
end

function modifier_pudge_sacrifice_charge_cooldown:IsPurgable()
	return false
end

function modifier_pudge_sacrifice_charge_cooldown:IsBuff()
	return true
end

function modifier_pudge_sacrifice_charge_cooldown:OnDestroy()
	if IsServer() then
		self:GetParent():AddNewModifier(self:GetParent(), self:GetAbility(), "modifier_pudge_sacrifice_charge", nil)
	end
end

function modifier_pudge_sacrifice_charge_cooldown:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_PERMANENT
end

modifier_pudge_sacrifice = class({})

function modifier_pudge_sacrifice:IsDebuff()
	return true
end

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

function modifier_pudge_sacrifice:IsStunDebuff()
	return true
end

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

function modifier_pudge_sacrifice:OnCreated( kv )
	self.sacrifice_damage = self:GetAbility():GetSpecialValueFor( "sacrifice_damage" )
	self.strength_damage_scepter = self:GetAbility():GetSpecialValueFor( "sacrifice_atributes" )

	if IsServer() then
		self:GetParent():InterruptChannel()
		self:OnIntervalThink()
		self:StartIntervalThink( 1 )
	end
end

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

function modifier_pudge_sacrifice:OnDestroy()
	if IsServer() then
		self:GetCaster():InterruptChannel()
	end
end

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

function modifier_pudge_sacrifice:OnIntervalThink()
	if IsServer() then
		local flDamage = self.sacrifice_damage
		flDamage = flDamage + ((self:GetCaster():GetStrength() + self:GetCaster():GetAgility() + self:GetCaster():GetIntellect()) * (self.strength_damage_scepter/100) )
		self:GetCaster():Heal( flDamage, self:GetAbility() )

		local damage = {
			victim = self:GetParent(),
			attacker = self:GetCaster(),
			damage = flDamage/10,
			damage_type = DAMAGE_TYPE_MAGICAL,
			ability = self:GetAbility()
		}

		ApplyDamage( damage )
		EmitSoundOn( "Hero_Pudge.Dismember", self:GetParent() )
	end
end

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

function modifier_pudge_sacrifice:CheckState()
	local state = {
		[MODIFIER_STATE_STUNNED] = true,
		[MODIFIER_STATE_INVISIBLE] = false,
	}

	return state
end

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

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

	return funcs
end

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

function modifier_pudge_sacrifice:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end
 
Последнее редактирование модератором:
Решил вопрос так:
Код:
LinkLuaModifier( "modifier_pudge_sacrifice", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_pudge_sacrifice_visible", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_pudge_sacrifice_charge", "heroes/hero_butcher/pudge_sacrifice.lua" ,LUA_MODIFIER_MOTION_NONE )

pudge_sacrifice = class({})

function pudge_sacrifice:GetIntrinsicModifierName() 
	return "modifier_pudge_sacrifice_visible"
end

function pudge_sacrifice:CastFilterResultTarget( hTarget )
	if IsServer() then
		if self:GetCaster():HasScepter() then
			local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_charge")
			if mod_visible:GetStackCount() == 0 then
				return UF_FAIL_CUSTOM
			else
				return UF_SUCCESS
			end
		end

		local nResult = UnitFilter( hTarget, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, self:GetCaster():GetTeamNumber() )
		if nResult ~= UF_SUCCESS then
			return nResult
		end
	end
	return UF_SUCCESS
end

function pudge_sacrifice:GetCustomCastErrorTarget( hTarget )
	if IsServer() then
		if self:GetCaster():HasScepter() then
			local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_charge")
			if mod_visible:GetStackCount() == 0 then
				return "#dota_hud_error_charges"
			end
		end
	end
	return ""
end

function pudge_sacrifice:GetCooldown( nLevel )
	if self:GetCaster():HasScepter() then
		return 0.5
	end

	return self.BaseClass.GetCooldown( self, nLevel )
end

function pudge_sacrifice:GetConceptRecipientType()
	return DOTA_SPEECH_USER_ALL
end

function pudge_sacrifice:SpeakTrigger()
	return DOTA_ABILITY_SPEAK_CAST
end

function pudge_sacrifice:GetChannelTime()
	self.hero_duration = self:GetSpecialValueFor( "sacrifice_duration" )
	return self.hero_duration
end

function pudge_sacrifice:OnAbilityPhaseStart()
	if IsServer() then
		self.hVictim = self:GetCursorTarget()
		local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_visible")
		if self:GetCaster():HasScepter() then
			mod_visible:ForceRefresh()
			mod_visible:StartChargeCooldown(self, 60)
		end
		return true
	end
end

function pudge_sacrifice:OnSpellStart()
	if self.hVictim:TriggerSpellAbsorb( self ) then
		self.hVictim = nil
		self:GetCaster():Interrupt()
	else
		self.hVictim:AddNewModifier( self:GetCaster(), self, "modifier_pudge_sacrifice", { duration = self:GetChannelTime() } )
		self.hVictim:Interrupt()
	end
end

function pudge_sacrifice:OnChannelFinish( bInterrupted )
	if bInterrupted then
		self.hVictim:RemoveModifierByName( "modifier_pudge_sacrifice" )
	end
	if IsServer() then
		local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_charge")
		local stacks_n = mod_visible:GetStackCount()
		if stacks_n <= 1 then
			mod_visible:SetStackCount(0)
			self:StartCooldown(60)
			Timers:CreateTimer(60, function()
				mod_visible:IncrementStackCount()
			return nil
			end)
		end
	end
end

modifier_pudge_sacrifice_visible = class({})

function modifier_pudge_sacrifice_visible:RemoveOnDeath()
	return false
end

function modifier_pudge_sacrifice_visible:DestroyOnExpire()
	return false
end

function modifier_pudge_sacrifice_visible:IsPurgable()
	return false
end

function modifier_pudge_sacrifice_visible:IsBuff()
	return true
end

function modifier_pudge_sacrifice_visible:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_MULTIPLE
end

function modifier_pudge_sacrifice_visible:IsHidden() 
	if IsServer() then
		if self:GetCaster():HasScepter() then
			return false
		end
	end
	return false
end

function modifier_pudge_sacrifice_visible:OnCreated()
	if IsServer() then
		self.firs_time = true
		if self.firs_time == true then
			self:SetStackCount(2)
			self:GetCaster():AddNewModifier(self:GetCaster(), self:GetAbility(), "modifier_pudge_sacrifice_charge", nil)
			local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_charge")
			mod_visible:SetStackCount(3) 
		end
		self.firs_time = false
		--self:StartIntervalThink(0.1)
		self.stack = self:GetStackCount()
	end
end

--[[function modifier_pudge_sacrifice_visible:OnIntervalThink()
	if IsServer() then
		local stacks = self:GetStackCount()
		if self.stack ~= stacks then
			self:OnStacksChanged()
		end
	end
end]]

function modifier_pudge_sacrifice_visible:StartChargeCooldown(abil, cooldown)
	if IsServer() then
		self:SetDuration(cooldown, true)
		self:DecrementStackCount()
		local mod_visible = self:GetCaster():FindModifierByName("modifier_pudge_sacrifice_charge")
		local stacks_n = mod_visible:GetStackCount()
		mod_visible:DecrementStackCount()
		Timers:CreateTimer(cooldown, function()
			mod_visible:IncrementStackCount()
			self:IncrementStackCount()
			return nil
		end)
	end
end

modifier_pudge_sacrifice = class({})

function modifier_pudge_sacrifice:IsDebuff()
	return true
end

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

function modifier_pudge_sacrifice:IsStunDebuff()
	return true
end

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

function modifier_pudge_sacrifice:OnCreated( kv )
	self.sacrifice_damage = self:GetAbility():GetSpecialValueFor( "sacrifice_damage" )
	self.strength_damage_scepter = self:GetAbility():GetSpecialValueFor( "sacrifice_atributes" )

	if IsServer() then
		self:GetParent():InterruptChannel()
		self:OnIntervalThink()
		self:StartIntervalThink( 1 )
	end
end

function modifier_pudge_sacrifice:OnIntervalThink()
	if IsServer() then
		local flDamage = self.sacrifice_damage
		flDamage = flDamage + ((self:GetCaster():GetStrength() + self:GetCaster():GetAgility() + self:GetCaster():GetIntellect()) * (self.strength_damage_scepter/100) )
		self:GetCaster():Heal( flDamage, self:GetAbility() )

		local damage = {
			victim = self:GetParent(),
			attacker = self:GetCaster(),
			damage = flDamage/10,
			damage_type = DAMAGE_TYPE_MAGICAL,
			ability = self:GetAbility()
		}

		ApplyDamage( damage )
		EmitSoundOn( "Hero_Pudge.Dismember", self:GetParent() )
	end
end

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

function modifier_pudge_sacrifice:CheckState()
	local state = {
		[MODIFIER_STATE_STUNNED] = true,
		[MODIFIER_STATE_INVISIBLE] = false,
	}

	return state
end

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

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

	return funcs
end

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

function modifier_pudge_sacrifice:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end

modifier_pudge_sacrifice_charge = class({})

function modifier_pudge_sacrifice_charge:RemoveOnDeath()
	return false
end

function modifier_pudge_sacrifice_charge:IsPurgable()
	return false
end

function modifier_pudge_sacrifice_charge:IsBuff()
	return true
end

function modifier_pudge_sacrifice_charge:IsHidden()
	return true
end

function modifier_pudge_sacrifice_charge:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_NONE
end
 
Последнее редактирование модератором:
Реклама: