как сделать спавнер крипа кастомного?

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

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
пытался делать по гайду который где то был но не получилось, потому что не смог понять куда что пихать и откуда запускать функцию.
Если сможете объясните или сыллку на то где это есть.
 
Ищи по ключевым словам и функциям: CreateUnitByName(), SpawnUnit
 
Код:
local double = CreateUnitByName( caster:GetUnitName(), spawn_location, true, caster, caster:GetOwner(), caster:GetTeamNumber())
	double:SetControllableByPlayer(caster:GetPlayerID(), false)
 
Adam Smith, Роман, мне нужна функция которая с таймером как обычный кемп нейтралов призывает крипа и куда ее пихать.
 
[quote author=Danis link=topic=971.msg5176#msg5176 date=1467907845]
Adam Smith, Роман, мне нужна функция которая с таймером как обычный кемп нейтралов призывает крипа и куда ее пихать.
[/quote]
Берешь таймеры от BMD, запускаешь ее при старте игры(запусти слушателя на эвент game_rules_state_change) и профит.
Код:
Timers:CreateTimer(1, function() -- таймер для спавна нейтралов
   							SpawnNeutrals() -- функция в которой спавнятся
				   			return 60.0 -- повторить через минуту
 								end )
 
CryDeS, я чет не очень понял что за слушатель и
Timers:CreateTimer(1, function() -- для чего цифра 1 и что за функция?
SpawnNeutrals() -- это функция или что?

Попробовал сделать так как сказал, но не заработало, код
Код:
Timers:CreateTimer(1, function() SpawnNeutrals(
			local tpoint = Entities:FindByName( nil, "creep_radiant_1"):GetAbsOrigin()
            local current = CreateUnitByName("creep_dire_1", tpoint, true, nil, nil, DOTA_TEAM_NEUTRALS)
										)			
				return 60
				end)
	end
 
Последнее редактирование модератором:
[quote author=Danis link=topic=971.msg5179#msg5179 date=1467909466]
CryDeS, я чет не очень понял что за слушатель и
Timers:CreateTime(1, function() -- для чего цифра 1 и что за функция?
SpawnNeutrals() -- это функция или что?
[/quote]
1 значит запуск через 1 секунду, фунция это то что таймер вызове после одного своего такта.
SpawnNeutrals() это твоя функция в которой ты будешь спавнить крипов.
Слушатель - Listener
В InitGameMode
Код:
_G.IsGameStart = false
ListenToGameEvent('game_rules_state_change', 	OnGameStateChange)

Куда нибудь в этом же файле
Код:
function OnGameStateChange()
	if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
		if not _G.IsGameStart then 
			_G.IsGameStart = true;
			Timers:CreateTimer(1, function() -- таймер для спавна нейтралов
							SpawnNeutrals()
				   			return 60.0 -- повторить через минуту
 								end )
		end
	end
end

function SpawnNeutrals()
	local target_point 	= Entities:FindByName( nil, "CREEP_SPAWN_POINT" ); -- это объект который ставишь в хаммере как point_target и даешь ему имя CREEP_SPAWN_POINT
	local pos_vector  	= target_point:GetAbsOrigin(); -- получаем координаты объекта. 
	local creep			= CreateUnitByName( "npc_dota_neutral_kobold", pos_vector, true, nil, nil, DOTA_TEAM_NEUTRALS) -- CreateUnitByName(unit_name, vector, find_clear_space, ownernpc, ownerunit, team)
end
 
Последнее редактирование модератором:
CryDeS, так?
Код:
-- Generated from template
require('barebones')
require('timers')
if CAddonTemplateGameMode == nil then
	CAddonTemplateGameMode = class({})
end

function Precache( context )
	--[[
		Precache things we know we'll use. Possible file types include (but not limited to):
			PrecacheResource( "model", "*.vmdl", context )
			PrecacheResource( "soundfile", "*.vsndevts", context )
			PrecacheResource( "particle", "*.vpcf", context )
			PrecacheResource( "particle_folder", "particles/folder", context )
	]]
end
_G.maxLevel = 50
-- Create the game mode when we activate
function Activate()
	GameRules.AddonTemplate = CAddonTemplateGameMode()
	GameRules.AddonTemplate:InitGameMode()
	end

function OnGameStateChange()
	if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
		if not _G.IsGameStart then 
			_G.IsGameStart = true;
			Timers:CreateTimer(1, function SpawnNeutrals()
								local target_point 	= Entities:FindByName( nil, "creep_radiant_1" ); -- это объект который ставишь в хаммере как point_target и даешь ему имя CREEP_SPAWN_POINT
								local pos_vector  = target_point:GetAbsOrigin(); -- получаем координаты объекта. 
								local creep			= CreateUnitByName( "dire_creeps_1", pos_vector, true, nil, nil, DOTA_TEAM_NEUTRALS) -- CreateUnitByName(unit_name, vector, find_clear_space, ownernpc, ownerunit, team)
								return 1
									end )
		end
	end
end

function CAddonTemplateGameMode:InitGameMode()
	print( "Template addon is loaded." )
	GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
	GameRules:SetUseUniversalShopMode( true )
	_G.IsGameStart = false
ListenToGameEvent('game_rules_state_change', 	OnGameStateChange)
end

-- Evaluate the state of the game
function CAddonTemplateGameMode:OnThink()
	if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
		--print( "Template addon script is running." )
	elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
		return nil
	end
	return 1
end

function CDOTABaseGameMode:SetCustomHeroMaxLevel(maxLevel)	end
 
Последнее редактирование модератором:
[quote author=Danis link=topic=971.msg5182#msg5182 date=1467912006]
CryDeS, так?
[/quote]
Вот так
Код:
			Timers:CreateTimer(1, function()
									.......
									end )
 
CryDeS, Ну не знаю, оно запрашивает какие то числа из таблицы
 
[quote author=Danis link=topic=971.msg5185#msg5185 date=1467930718]
CryDeS, Ну не знаю, оно запрашивает какие то числа из таблицы
[/quote]
А поточнее? Что запрашивает, какой таблицы?
 
CryDeS,
Код:
attempt to call a table value
stack traceback:
Это пишет
 
Прошу скиньте рабочий код с таймером на спавн юнитов в точке, то как не пытаюсь не могу сделать что бы работало выдает ошибку да еще и два раза: [quote author=Danis link=topic=971.msg5198#msg5198 date=1467976060]
CryDeS,
Код:
attempt to call a table value
stack traceback:
[/quote]
Если у кого то завалялся поделитесь
 
Danis, на, примерно так должно быть
Код:
require('barebones')
require('timers')
if CAddonTemplateGameMode == nil then
  CAddonTemplateGameMode = class({})
end
_G.IsGameStart = false
ListenToGameEvent('game_rules_state_change',OnGameStateChange)
function Precache( context )
end
_G.maxLevel = 50
function Activate()
  GameRules.AddonTemplate = CAddonTemplateGameMode()
  GameRules.AddonTemplate:InitGameMode()
end
function OnGameStateChange()
  if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
   if not _G.IsGameStart then
     _G.IsGameStart = true;
     Timers:CreateTimer(function()
         local target_point  = Entities:FindByName( nil, "creep_radiant_1" ); -- это объект который ставишь в хаммере как point_target и даешь ему имя CREEP_SPAWN_POINT
        local pos_vector  = target_point:GetAbsOrigin(); -- получаем координаты объекта.
        CreateUnitByName( "dire_creeps_1", pos_vector, true, nil, nil, DOTA_TEAM_NEUTRALS) -- CreateUnitByName(unit_name, vector, find_clear_space, ownernpc, ownerunit, team)
         return 1.0
      end
     )
   end
  end
end
function CAddonTemplateGameMode:InitGameMode()
  print( "Template addon is loaded." )
  GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
  GameRules:SetUseUniversalShopMode( true )
  _G.IsGameStart = false
ListenToGameEvent('game_rules_state_change',  OnGameStateChange)
end
function CAddonTemplateGameMode:OnThink()
  if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
  elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
   return nil
  end
  return 1
end
function CDOTABaseGameMode:SetCustomHeroMaxLevel(maxLevel)
end
 
Последнее редактирование модератором:
Оно заработало!!! 8)
Код:
function OnGameStateChange()
	if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
		if not _G.IsGameStart then 
			_G.IsGameStart = true;
			local repeat_interval = 1 -- Rerun this timer every *repeat_interval* game-time seconds
		  local start_after = 1 -- Start this timer *start_after* game-time seconds later
		  print("surprise")

			  	Timers:CreateTimer(start_after, function()
			    SpawnCreeps()
			    return repeat_interval
			  end)
		end
	end
end


_G.IsGameStart = false
ListenToGameEvent("game_start", Dynamic_Wrap(GameMode, "OnGameInProgress"), self)
 
Последнее редактирование модератором:
Поздравляю. А зачем тебе repeat_interval и start_after ? Можешь же без них обойтись:

Код:
function OnGameStateChange()
	if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
		if not _G.IsGameStart then 
			_G.IsGameStart = true;
		  	print("surprise")
			Timers:CreateTimer(1, function()
				SpawnCreeps()
			    return 1
			end)
		end
	end
end
 
Последнее редактирование модератором:
Последнее редактирование модератором:
Поздравляю. А зачем тебе repeat_interval и start_after ? Можешь же без них обойтись:

Код:
function OnGameStateChange()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        if not _G.IsGameStart then
            _G.IsGameStart = true;
              print("surprise")
            Timers:CreateTimer(1, function()
                SpawnCreeps()
                return 1
            end)
        end
    end
end
Почему ListenToGameEvent('game_rules_state_change' работает, а ListenToGameEvent('game_start' нет? Где об этом можно почитать?
 
Почему ListenToGameEvent('game_rules_state_change' работает, а ListenToGameEvent('game_start' нет? Где об этом можно почитать?
Чел, теме уже 7 лет и API доты уже давно сменилось, найди актуальную тему или спроси по новой, что ты хочешь
Может, что ты хочешь есть тут?
 
Последнее редактирование:
Реклама: