Спавн юнита

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

Agrail

Новичок
25 Мар 2017
4
0
Йоу, в чём тут проблема?
Код:
 function Unit.GetUnitNameByID( id )
  if id == 11 then return "creature_enchantress_treantprotector"
  elseif id == 12 then return "creature_enchantress_treants"
  end
  print ('ID find')
end

function UnitSpawn( event )
local caster = event.caster
local owner = caster:GetOwner()
local pos = event.caster:GetCursorPosition() + event.caster:GetForwardVector()
local unit_name = Unit.GetUnitNameByID(id)
local Unit = CreateUnitByName(unit_name, pos, true, caster, caster, caster:GetTeamNumber())
Unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false)
Unit:SetOwner(owner)
print ('Unit spawn')	
end

Код:
 "enchantress_treantprotector"
  {
	 "BaseClass"	"ability_datadriven"
	 "AbilityTextureName"	"treant_natures_guise"
	 "MaxLevel"	"1"
	 "AbilityBehavior"	"DOTA_ABILITY_BEHAVIOR_POINT"
	 "AbilityUnitTargetType"	"DOTA_UNIT_TARGET_BASIC"
	 "AbilityType"	"DOTA_ABILITY_TYPE_BASIC"
	 "AbilityManaCost"	"8"
	 "AbilityCooldown"	"10.0"
	 "AbilityCastRange"	"7000"
	 
	 "PlayerCanControl"				"0"
	 
	 "AbilitySpecial"
	 {
		"01"
		{
			"var_type"	"FIELD_INTEGER"
			"atk_damage_tooltip"	"250"
		}

		"02"
		{
			"var_type"	"FIELD_FLOAT"
			"atk_speed_tooltip"	"2.5"
		}

		"03"
		{
			"var_type"	"FIELD_INTEGER"
			"atk_range_tooltip"	"150"
		}

		"04"
		{
			"var_type"	"FIELD_INTEGER"
			"health_tooltip"	"2550"
		}

		"05"
		{
			"var_type"	"FIELD_INTEGER"
			"armor_tooltip"	"4"
		}

		"06"
		{
			"var_type"	"FIELD_INTEGER"
			"unitID"	"11"
		}
	
	 }
	 "precache"
	 {
		"particle" 	"particles/units/heroes/hero_treant/treant_naturesguise_cast.vpcf"
		"soundfile" "soundevents/game_sounds_heroes/game_sounds_treant.vsndevts"
		"model"		"models/heroes/treant_protector/treant_protector.vmdl"
		"model"           "models/heroes/treant_protector/treant_crow.vmdl"
	  "model"           "models/heroes/treant_protector/head.vmdl"
	  "model"           "models/heroes/treant_protector/hands.vmdl"
	  "model"           "models/heroes/treant_protector/foliage.vmdl"
	 }
	  "OnSpellStart"
		{
			"RunScript"
			{
				"ScriptFile"	"unit.lua"
				"Function"	"UnitSpawn"
			}
	
		}
  }

Код:
[ W VScript       ]: Script Runtime Error: ...a\game\dota_addons\heroesclash\scripts\vscripts\unit.lua:16: attempt to index local 'Unit' (a nil value)
[ W VScript       ]: stack traceback:
[ W VScript       ]: 	...a\game\dota_addons\heroesclash\scripts\vscripts\unit.lua:16: in function <...a\game\dota_addons\heroesclash\scripts\vscripts\unit.lua:11>
 
Последнее редактирование модератором:
local unit_name = Unit.GetUnitNameByID(id)
В этой строке Unit = nil.
Переименуй функцию в просто function GetUnitNameByID(id) и убери Unit.
Либо, сделай класс
Код:
Unit = class({})
а потом функцию
Код:
function Unit:GetUnitNameByID(id)

и используй так же.
 
Вот что поменял и теперь нормально спавнит спавнит
Код:
local unit_name = GetUnitNameByID(event.ability:GetSpecialValueFor("unitID"))

Но теперь другая проблема, почему я могу контролировать юнита, если
Код:
Unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false)

И почему юниты спавнятся "лицом" вправо
Код:
local pos = event.caster:GetCursorPosition() + event.caster:GetForwardVector()
 
Последнее редактирование модератором:
[quote author=Agrail link=topic=1408.msg9048#msg9048 date=1490995518]
Но теперь другая проблема, почему я могу контролировать юнита, если
Код:
Unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false)
[/quote]

Ну так ты же и задаешь контроль над юнитом. Убери строчку и не будет контроля.

[quote author=Agrail link=topic=1408.msg9048#msg9048 date=1490995518]
И почему юниты спавнятся "лицом" вправо
Код:
local pos = event.caster:GetCursorPosition() + event.caster:GetForwardVector()
[/quote]

Попробуй сделать просто
Код:
local pos = event.caster:GetForwardVector()
- будет смотреть туда же, куда и кастер. А то ты зачем-то вектора меж собой складываешь.
 
Последнее редактирование модератором:
[quote author=Agrail link=topic=1408.msg9048#msg9048 date=1490995518]
Но теперь другая проблема, почему я могу контролировать юнита, если
Код:
Unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false)

И почему юниты спавнятся "лицом" вправо
Код:
local pos = event.caster:GetCursorPosition() + event.caster:GetForwardVector()
[/quote]
Потому что смотри какой второй аргумент у функции.
А лицом вправо спавнятся все юниты, и это направление зависит не от вектора.
Используй unit:SetAngles

[quote author=Илья link=topic=1408.msg9049#msg9049 date=1490999451]
Попробуй сделать просто
Код:
local pos = event.caster:GetForwardVector()
- будет смотреть туда же, куда и кастер. А то ты зачем-то вектора меж собой складываешь.
[/quote]
Балда, так он заспавнится в центре карты, это позиция, а не поворот .
 
Последнее редактирование модератором:
Я без понятия, что у него за переменная pos, не смотрел первый пост. Раз он с ней строчку указал во втором посте, то я решил, что он её использует в
Код:
SetForwardVector()
 
Реклама: