Сплэш для дальнего боя

kkee

Новичок
4 Апр 2016
9
0
кто может скинуть скрипт сплэша на дальников и txt и lua и объяснить как это делается?
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Re: скрипт

кто может скинуть скрипт сплэша на дальников и txt и lua и объяснить как это делается?
Есть отличная команда о которой я ток недавно узнал
Код:
hero:PerformAttack(hTarget, bUseCastAttackOrb,bProcessProcs, bSkipCooldown, bIgnoreInvis)
Она совершает атаку на выбраного юнита. Так что ты можешь просто искать рядом с врагом других врагов и используя эту команду делать сплеш.
Ну или использовать стандартную дотовскую:
Код:
DoCleaveAttack
Подробнее:
https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/API/Global.DoCleaveAttack
 
Последнее редактирование модератором:

kkee

Новичок
4 Апр 2016
9
0
Re: скрипт

мне нужен скрипт предмета сплеша типо battlefury
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Re: скрипт

Тут насколько я знаю не очень любят давать все готовое.

Хахахах, в точку.

Однако, сколько ни учи, все равно каждый раз по новой приходят люди и хотят готовенькое. Поэтому я решил давать готовенькое: нервы экономятся.


kkee, если хочешь готовенькое, то придется ждать. Сколько - не известно. Лично у меня нет времени на предмет. Может кто-то тебе и сделает.

А так, Cry тебе все необходимое уже сказал.
 
Последнее редактирование модератором:

kkee

Новичок
4 Апр 2016
9
0
Re: скрипт

crydes а можешь дать исходники ангел арены?
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Если научишься искать инфу, то найдешь на форуме способ залезть в его код.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
я холи буку посмотреть хотел
Файл снарядов я где то уже на форуме кидал вроде.
Код:
local projectiles = require("heroes/projectiles")

function HolyBook_attack( keys )
	local caster = keys.caster
	if caster and not caster:IsRealHero() then return end
	local target = keys.target
	local ability = keys.ability

	local position = keys.target:GetAbsOrigin()
	local team = keys.target:GetOpposingTeamNumber() 
	local radius = keys.Radius
	local damage_percent = keys.ability:GetLevelSpecialValueFor( "damage_percent", keys.ability:GetLevel() - 1 )

	local damage = keys.Damage*(damage_percent/100)
	local fly_time
	local projectile_temp = projectiles[caster:GetUnitName()]
	local projectile_model, projectile_speed
	
	if projectile_temp then
		projectile_model = projectile_temp.model
		projectile_speed = projectile_temp.speed
	else
		projectile_model = ""
		projectile_speed = 2000
	end

	local is_first = false
	for i = 0, 5 do 
		local item = caster:GetItemInSlot(i)

		if item then
			if (item:GetName() == "item_holy_book" or item:GetName() == "item_holy_book_2" ) and not is_first then
				if item ~= ability and caster:GetUnitName() == "npc_dota_hero_storm_spirit" then damage = damage/2.5 end
				if item ~= ability then damage = damage/2 end

				is_first = true
			end
		end
	end

	local units = FindUnitsInRadius(team, position, nil, radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false) 
	local caster_attack_speed = caster:GetAttacksPerSecond()

	for _, x in pairs(units) do
		if x ~= keys.target then
			if x and caster and x:GetTeamNumber() ~= caster:GetTeamNumber() and IsValidEntity(x) and x:IsAlive() then
				
				if projectile_model and caster_attack_speed < 8 then
					local info = {
	   				Target = x,
    				Source = keys.target,
    				EffectName = projectile_model,
	    			bDodgeable = false,
    				bProvidesVision = true,
    				iMoveSpeed = projectile_speed,
    				iVisionRadius = 0,
    				iVisionTeamNumber = caster:GetTeamNumber(),
	  			}
  				ProjectileManager:CreateTrackingProjectile( info )
  				fly_time = FindDistance(x:GetAbsOrigin(), position) / projectile_speed
  			else
	  			fly_time = 0.1
  				end
  				Timers:CreateTimer(fly_time, function()
   							if x and IsValidEntity(x) and x:IsAlive() and caster and IsValidEntity(caster) then
   								if x:GetUnitName() == "npc_dota_hero_meepo" then
   									damage = damage/4
   								end
   								if target then
   									if x:IsIllusion() or target:IsIllusion() then
	   									damage = damage / 5
   									end
   								else
   									if x:IsIllusion() then
	   									damage = damage / 5
   									end
   								end
   								ApplyDamage({ victim = x, attacker = caster, damage = damage,	damage_type = DAMAGE_TYPE_PURE })
   							end
				   			return nil
 								end )
			end
			
		end
	end
end

function FindDistance(vec1, vec2)
	return math.sqrt(math.abs(vec1.x - vec2.x)^2 + math.abs(vec1.y - vec2.y)^2 + math.abs(vec1.z - vec2.z)^2 )
end
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Но можно сделать проще.
Код:
function HolyBook_attack( keys )
	local caster = keys.caster
	if caster and not caster:IsRealHero() then return end
	local target = keys.target
	local ability = keys.ability

	local position = keys.target:GetAbsOrigin()
	local team = keys.target:GetOpposingTeamNumber() 
	local radius = keys.Radius
	local damage_percent = keys.ability:GetLevelSpecialValueFor( "damage_percent", keys.ability:GetLevel() - 1 )

	local damage = keys.Damage*(damage_percent/100)
	
	local units = FindUnitsInRadius(team, position, nil, radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false) 

	for _, unit in pairs(units) do
		caster:PerformAttack(unit, false, false, false, false, true)
	end
end
 
Последнее редактирование модератором:

MRK1

Новичок
7 Апр 2016
6
0
Ты можешь сделать на основе этого
[vimeo]https://vimeo.com/161959123[/vimeo]
Код:
"ability_projectile_tracking"
{
  // General
  //-------------------------------------------------------------------------------------
  "BaseClass" "ability_datadriven" 
  "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
  "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
  "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
  "AbilityUnitDamageType" "DAMAGE_TYPE_PURE"

  // Stats
  //-------------------------------------------------------------------------------------
  "AbilityCastRange" "600"
  "AbilityDamage" "100"

  // Special
  //-------------------------------------------------------------------------------------
  "AbilitySpecial"
  {
    "01"
    {
      "var_type" "FIELD_INTEGER"
      "radius" "1000"
    }
  }

  "precache"
  {
    "particle" "particles/units/heroes/hero_enchantress/enchantress_impetus.vpcf"
  }

  // Data Driven
  //-------------------------------------------------------------------------------------
  "OnSpellStart"
  {
    "ActOnTargets"
    {
      "Target"
      {
        "Center" "CASTER"
        "Radius" "%radius"
        "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" 
        "Types" "DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_HERO"
      }
      "Action"
      {
        "TrackingProjectile"
        {
          "Target" "TARGET"
          "EffectName" "particles/units/heroes/hero_enchantress/enchantress_impetus.vpcf"
          "Dodgeable" "1"
          "ProvidesVision" "1"
          "VisionRadius" "300"
          "MoveSpeed" "1000"
          "SourceAttachment" "DOTA_PROJECTILE_ATTACHMENT_ATTACK_1"
        }
      }
    }
  }

  "OnProjectileHitUnit"
  {
    "DeleteOnHit" "1"
    "Damage"
    {
      "Type" "DAMAGE_TYPE_PHYSICAL"
      "Damage" "%AbilityDamage"
      "Target" "TARGET"
    }
  }
}
 
Последнее редактирование модератором:

tasman208

Активный
30 Мар 2016
128
0
Я сделал предмет со скриптом для такого дела, но при атаке сплеш наносит 100% урона, как его чуть приубавить? никак не соображу. Вот функция, которая вызывается при атаке
Код:
function attack(keys)
	local units = FindUnitsInRadius(keys.caster:GetTeam(), keys.target:GetOrigin(), nil, 250, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_OTHER, DOTA_UNIT_TARGET_FLAG_NONE, 0, false )
	for _,unit in pairs(units) do
		if unit ~= keys.target then
			keys.caster:PerformAttack(unit, false, false, true, false, false)
		end
	end 
end
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=tasman208 link=topic=808.msg3522#msg3522 date=1460056107]
Я сделал предмет со скриптом для такого дела, но при атаке сплеш наносит 100% урона, как его чуть приубавить? никак не соображу. Вот функция, которая вызывается при атаке
Код:
function attack(keys)
	local units = FindUnitsInRadius(keys.caster:GetTeam(), keys.target:GetOrigin(), nil, 250, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_OTHER, DOTA_UNIT_TARGET_FLAG_NONE, 0, false )
	for _,unit in pairs(units) do
		if unit ~= keys.target then
			keys.caster:PerformAttack(unit, false, false, true, false, false)
		end
	end 
end
[/quote]
Модификатор на снижение урона делать перед атакой.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
._. Есть варианты как это сделать?
Пишешь модификатор который делает -65% урона через MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE
Перед атакой накладываешь его на того кто бьет сплешом, после снимаешь.
Или используй DoCleaveAttack
https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/API/Global.DoCleaveAttack
 
Последнее редактирование модератором:
Реклама: