Исчезает юнит после старта игры

Primo

Пользователь
26 Авг 2016
64
0
Снова очередная магия ::)
Из названия топика думаю понятно, в чем проблема.

В общем, на карте присутствует 8 юнитов
Код:
	"npc_dota_ve_keeper"
	{
		// General
		//----------------------------------------------------------------
		"BaseClass"       "npc_dota_creature"
		"Model"         "models/heroes/omniknight/omniknight.vmdl"
		"ModelScale"      "1.6"
		"SoundSet"					  "Hero_Omniknight"
		"GameSoundsFile"				"soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts"
		"Level"         "1"
		"HealthBarOffset"    "450"
	
		"Ability1"							"medusa_split_shot"
	
		// Armor
		//----------------------------------------------------------------
		"MagicalResistance"   "25"
		"ArmorPhysical"     "15"
	
		// Attack
		//----------------------------------------------------------------
		"AttackCapabilities"  "DOTA_UNIT_CAP_RANGED_ATTACK"
		"AttackDamageType"   "DAMAGE_TYPE_ArmorPhysical"
		"AttackDamageMin"    "50"
		"AttackDamageMax"    "115"
		"AttackRate"      "0.8"
		"AttackAnimationPoint" "0.5"
		"AttackAcquisitionRange" "850"
		"AttackRange"      "850"
		"ProjectileModel"    "particles/units/heroes/hero_shadowshaman/shadowshaman_ether_shock.vpcf"
		"ProjectileSpeed"    "2500"
		"IsAncient"          "1" 
		"IsNeutralUnitType"      "0"
	
		// Bounty
		//----------------------------------------------------------------
		"BountyGoldMin"     "1000"
		"BountyGoldMax"     "1000"
		"CanBeDominated"      "0"
		"ConsideredHero" "1"
	
		// Bounds
		//----------------------------------------------------------------
		"BoundsHullName"    "DOTA_HULL_SIZE_HERO"
		"CollisionSize"					"200"
		"RingRadius"      "50"
	
		// Movement
		//----------------------------------------------------------------
		"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE"
		"MovementSpeed"     "0"
		"MovementTurnRate"   "1"
	
		// Status
		//----------------------------------------------------------------
		"StatusHealth"     "6000"
		"StatusHealthRegen"   "1.0"
		"StatusMana"      "1000"
		"StatusManaRegen"    "1"
	
		// Vision
		//----------------------------------------------------------------
		"VisionDaytimeRange"  "1400"
		"VisionNighttimeRange" "800"
	
		// Team
		//----------------------------------------------------------------
		"TeamName"       "DOTA_TEAM_CUSTOM_8"
		"CombatClassAttack"   "DOTA_COMBAT_CLASS_ATTACK_HERO"
		"CombatClassDefend"   "DOTA_COMBAT_CLASS_DEFEND_HERO"
		"UnitRelationShipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
	
		// Creature Data
		//----------------------------------------------------------------
		"Creature"
		{
			"DisableClumpingBehavior"    "1"
			"DefaultState"				"Invade"
			"States"
			{
				"Invade"
				{
					"Name"				"Invade"
					"Aggression"		"100.0"
					"Avoidance"			"0.0"
					"Support"			"0.0"
				}
			}
			"AttachWearables"
			{
				"Wearable1" {"ItemDef" "45" }
				"Wearable2" {"ItemDef" "8170" }
				"Wearable3" {"ItemDef" "8171" }
				"Wearable4" {"ItemDef" "8172" }
				"Wearable5" {"ItemDef" "8173" }
				"Wearable6" {"ItemDef" "8174" }
			}
		}
	}
Каждый юнит принадлежит своей команде, команд всего 8.
Когда игроки появляются на карте, лишние юниты удаляются. Т.е. удаляются юниты, в командах которых нет игроков.
Код:
function GameMode:OnAllPlayersLoaded()
	for team = 2, DOTA_TEAM_COUNT do
		if team ~= DOTA_TEAM_NEUTRALS and team ~= DOTA_TEAM_NOTEAM and team < 12 then
		
			local count = PlayerResource:GetPlayerCountForTeam(team)
			if count == 0 then
				local unitlist = FindUnitsInRadius(team, Vector(0, 0, 0), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false)
				 
				-- Make the found units move to (0, 0, 0)
				for _,unit in pairs(unitlist) do
				  unit:RemoveSelf()
				end
			end
			
		end
	end
end
Когда игра стартует, юниты окончательно исчезают. Хотя им просто хозяин присваивается.
Код:
function GameMode:OnGameInProgress()
	
	for playerID = 0, DOTA_MAX_TEAM_PLAYERS-1 do
		if PlayerResource:IsValidPlayerID(playerID) then
			local team = PlayerResource:GetTeam(playerID)
			keepers = FindUnitsInRadius(team, Vector(0, 0, 0), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false)
			 
			for _,unit in pairs(keepers) do
				unit:SetControllableByPlayer(playerID, true)
				unit:SetOwner(PlayerResource:GetPlayer(playerID))
			end
		end
	end
end


P.S. примечательно то, что это происходит не всегда. Т.е. иногда всё нормально, все юниты остаются видимыми, а иногда исчезают. Причём, перед тем как исчезнуть, они выглядят как статические модели без анимации и полоски здоровья, как видно на скринах выше.
P.S.S. юнит просто исчезает, попытаться выделить его можно.
P.S.S.S. Своего юнита я вижу в любом случае, пропадает вражеский.
 
Последнее редактирование модератором:

Илья

Супермодератор
Команда форума
25 Сен 2015
2,348
31
Через консоль то проверял, в чем дело (через print отработку)? Может ты как-то не верно определяешь игроков.
 

Primo

Пользователь
26 Авг 2016
64
0
Илья, проверял, глухо. Не думаю, что игрок может определяться неверно.
Когда игрок появляется на карте (GameMode:OnAllPlayersLoaded), удаляются все лишние юниты, т.е. по логике в OnGameInProgress, когда в командах ищем этого юнита, нам должно вернуть nil, если юнита в команде возможного игрока нет.
Конечно, тут можно добавить проверку на этот самый nil, но я не думаю, что это сыграет какую-то роль, ведь проблема появляется еще с GameMode:OnAllPlayersLoaded (а может и раньше), когда на карте видно статическую модель без анимации и хпбара.

Всё мысль возникает, что это из-за npc_dota_base. Как вариант, можно попробовать через createunitbyname сделать, вдруг поможет, как предложил gameizeazy, но хотелось бы услышать еще варианты решения проблемы.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,273
92
Primo, а не легче просто для каждого игрока создавать юнита при заходе в игру?
 
Реклама: