Прошу помощи в объяснении создания некоторых скриптов

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

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Никак не пойму как сделать модификатор по типу мидаса только чтобы он не давал золота и не убивал крипа(сделано) но давал опыт и ловкость при касте но пишет что я не правильно написал датадрайвен модификатор, вот функция луа файла:
Код:
function 	item_agi_midas_on_spell_start(keys)
	keys.caster:AddExperience(keys.target:GetDeathXP() * keys.XPMultiplier, false, false)

	keys.target:EmitSound("DOTA_Item.Hand_Of_Midas")
	local midas_particle = ParticleManager:CreateParticle("particles/items2_fx/hand_of_midas.vpcf", PATTACH_ABSORIGIN_FOLLOW, keys.target)	
	ParticleManager:SetParticleControlEnt(midas_particle, 1, keys.caster, PATTACH_POINT_FOLLOW, "attach_hitloc", keys.caster:GetAbsOrigin(), false)
	keys.ability:ApplyDataDrivenModifier("modifier_agi_bonus", keys.caster)
end
Или я просто не понял как делать модификатор.
 
Последнее редактирование модератором:
CryDeS, Тоесть так?
Код:
keys.caster:ApplyDataDrivenModifier(keys.ability, keys.caster, "modifier_agi_bonus")
Правильный код(по крайней мере рабочий):
Код:
keys.ability:ApplyDataDrivenModifier(keys.caster, keys.caster, "modifier_agi_bonus", {duration = 100000})
Смог сделать только оно не стакается а только 1 раз добавляет бонус, но как сделать чтобы стакался бонус?
 
Последнее редактирование модератором:
Если хочешь бесконечное время повесить, то делается так:

keys.ability:ApplyDataDrivenModifier(keys.caster, keys.caster, "modifier_agi_bonus", {})

Насчет стакания - если этот модификатор изначально рассчитан на накопление, то тебе ребята объяснят (я обычно свой пилил, поэтому ниче тут сказать не могу). В противном случае, надо пилить свой модификатор.
 
Последнее редактирование модератором:
Илья, Погоди, СВОЙ модификатор? это как?
я пытался сделать через стаки но почему-то не получилось:
Код:
if caster:HasModifier( modifierName ) then
		ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
		caster:SetModifierStackCount( modifierName, caster, current_stack + 1 )
	else
		ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
		caster:SetModifierStackCount( modifierName, caster, 1)
	end
 
[quote author=Danis link=topic=977.msg5123#msg5123 date=1467626013]
Илья, Погоди, СВОЙ модификатор? это как?
я пытался сделать через стаки но почему-то не получилось:
Код:
if caster:HasModifier( modifierName ) then
		ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
		caster:SetModifierStackCount( modifierName, caster, current_stack + 1 )
	else
		ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
		caster:SetModifierStackCount( modifierName, caster, 1)
	end
[/quote]
Почти правильно пытался
Код:
if not caster:HasModifier(modifierName) then
  ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
end
caster:SetModifierStackCount( modifierName, caster, current_stack + 1 ) -- если стаков не было а был просто модификатор то current stack будет = 0
 
CryDeS, Не понимаю почему оно не хочет работать, код из луа файла
Код:
function item_agi_midas_on_spell_start(keys)
	local modifierName = "modifier_stack"
	local caster = keys.caster
	local ability = keys.ability
	local current_stack = caster:GetModifierStackCount( modifierName, caster )



	if not caster:HasModifier( modifierName ) then
		ability:ApplyDataDrivenModifier(ability, caster, modifierName, {})
	end

	caster:SetModifierStackCount(modifierName, caster, current_stack + 1)

	keys.target:EmitSound("DOTA_Item.Hand_Of_Midas")
	local midas_particle = ParticleManager:CreateParticle("particles/items2_fx/hand_of_midas.vpcf", PATTACH_ABSORIGIN_FOLLOW, keys.target)	
	ParticleManager:SetParticleControlEnt(midas_particle, 1, keys.caster, PATTACH_POINT_FOLLOW, "attach_hitloc", keys.caster:GetAbsOrigin(), false)
end
КВ код
Код:
"item_agi_midas"
	{
		"ID"		"289"
		"BaseClass"						"item_datadriven"
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_ENEMY"
		"AbilityUnitTargetType"			"DOTA_UNIT_TARGET_CREEP"
		"AbilityUnitTargetFlags"		"DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS | DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
		"Model"             "models/props_gameplay/red_box.vmdl" 
		"Effect"            "particles/generic_gameplay/dropped_item.vpcf"
		"AbilityTextureName"      "agi_midas"
		"AbilityCooldown"				"120.0"
		"ItemQuality"          "artifact"		// consumable component rare epic artifact secretshop
		
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"		"FIELD_INTEGER"
				"agi_per_stack"	"5"
			}
			"02"
			{
				"var_type"		"FIELD_INTEGER"
				"bonus_attack_speed"	"40"
			}
			"03"
			{
				"var_type"		"FIELD_INTEGER"
				"xp_multiplier"	"2.7"
			}
		}

		"OnSpellStart"
		{
			"RunScript"
			{
				"ScriptFile"			"items/item_agi_midas.lua"
				"Function"				"item_agi_midas_on_spell_start"
			}
		}

		"Modifiers"
		{
			"modifier_agi_midas"
			{
				"Passive"			"1"
				"IsHidden"			"1"
				"Attributes" 		"MODIFIER_ATTRIBUTE_MULTIPLE"
				
				"Properties"
				{
					"MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT"		"%bonus_attack_speed"
				}
			}
			"modifier_stack"
			{
				"Passive"			"0"
				"IsHidden"			"1"

				"Properties"
				{
					"MODIFIER_PROPERTY_STATS_AGILITY_BONUS"	"%agi_per_stack"
				}
			}
		}
	}
}
 
Последнее редактирование модератором:
[quote author=Danis link=topic=977.msg5125#msg5125 date=1467642083]
CryDeS, Не понимаю почему оно не хочет работать, код из луа файла

[/quote]
Если у тебя еще нет модификатора, то current_stack = nil (или нулю?), значит стаки нужно получать ПОСЛЕ накладывания модфикатора.
А так же, датадривен модификатор накладывается так:
Код:
ability:ApplyDataDrivenModifier(caster, target, modifier_name, { duration = duration })

Соответственно чутка поправив твой код должно работать.

Код:
[code]function item_agi_midas_on_spell_start(keys)
	local modifierName = "modifier_stack"
	local caster = keys.caster
	local ability = keys.ability


	if not caster:HasModifier( modifierName ) then
		ability:ApplyDataDrivenModifier(caster, caster, modifierName, {})
	end

	local current_stack = caster:GetModifierStackCount( modifierName, caster )

	caster:SetModifierStackCount(modifierName, caster, current_stack + 1)

	keys.target:EmitSound("DOTA_Item.Hand_Of_Midas")
	local midas_particle = ParticleManager:CreateParticle("particles/items2_fx/hand_of_midas.vpcf", PATTACH_ABSORIGIN_FOLLOW, keys.target)	
	ParticleManager:SetParticleControlEnt(midas_particle, 1, keys.caster, PATTACH_POINT_FOLLOW, "attach_hitloc", keys.caster:GetAbsOrigin(), false)
end
 
Последнее редактирование модератором:
Реклама: