Переменная, которая присваивается каждому юниту своя

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
В общем мне нужно вот что: Юнит убивает крипа(слушатель уже есть) затем создается(либо уже в созданную) переменная, в которую добавляется +1.
Но дело в том, что нужно, чтобы у каждого героя эта переменная была своя и для каждого крипа тоже.
Что то наподобие id.killedEntity, тоесть PlayerOwnerId и имя крипа.
Вот код, в котором, я пытаюсь что то похожее сделать:
Код:
function GameMode:OnEntityKilled( keys )
	print( '[BAREBONES] OnEntityKilled Called' )
	DeepPrintTable( keys )

	-- The Unit that was Killed
	local killedUnit = EntIndexToHScript( keys.entindex_killed )
	-- The Killing entity
	local killerEntity = nil
	local killedTeam = killedUnit:GetTeam()

	if keys.entindex_attacker ~= nil then
		killerEntity = EntIndexToHScript( keys.entindex_attacker )
	end
	local killerTeam = killerEntity:GetTeam()

	local id = killerEntity

--[[	id.runner_simple = 0				Что то наподобие вот такого должно быть или как?
	id.fly_simple = 0
	id.tank_simple = 0
	id.attacker_simple = 0
	id.guard_simple = 0
	id.hitter_simple = 0]]

	print("FLY SIMPLE " .. id.fly_simple)

	if killedUnit:IsCreature() then
		local name = killedUnit:GetUnitName()
		print("NAME KILLED UNIT IS: " .. name)
		local modifier = tostring("modifier_" .. name .. "_mut")
		if not killerEntity:HasModifier(modifier) then
			killerEntity:AddNewModifier(killerEntity,nil,modifier,{})
		end
		local current_stack = killerEntity:GetModifierStackCount(modifier,killerEntity)
		killerEntity:SetModifierStackCount(modifier,killerEntity,current_stack + 1)

		if name == fly_simple then
			id.fly_simple = id.fly_simple + 1
		elseif name == runner_simple then
			id.runner_simple = id.runner_simple + 1
		end

		if modifier == "modifier_runner_simple_mut" then
			id.runner_simple = id.runner_simple + 1
			if id.runner_simple >= 100 then
				id.runner_simple = 100
			end
		 	if current_stack >= 100 then
				killerEntity:SetModifierStackCount("modifier_runner_simple_mut", killerEntity, 100)
			end
		end

		if modifier == "modifier_fly_simple_mut" then
			id.fly_simple = id.fly_simple + 1
			if id.fly_simple >= 320 then
				id.fly_simple = 320
			end
			if current_stack >= 320 then
				killerEntity:SetModifierStackCount("modifier_fly_simple_mut", killerEntity, 320)
			end
		end

		if modifier == "modifier_tank_simple_mut" then
			id.tank_simple = id.tank_simple + 1
			if id.tank_simple >= 220 then
				id.tank_simple = 220
			end
			if current_stack >= 220 then
				killerEntity:SetModifierStackCount("modifier_tank_simple_mut", killerEntity, 220)
			end
		end

		if modifier == "modifier_attacker_simple_mut" then
			id.attacker_simple = id.attacker_simple + 1
			if id.attacker_simple >= 200 then
				id.attacker_simple = 200
			end
			if current_stack >= 200 then
				killerEntity:SetModifierStackCount("modifier_attacker_simple_mut", killerEntity, 200)
			end
		end

		if modifier == "modifier_guard_simple_mut" then
			id.guard_simple = id.guard_simple + 1
			if id.guard_simple >= 25 then
				id.guard_simple = 25
			end
			if current_stack >= 25 then
				killerEntity:SetModifierStackCount("modifier_guard_simple_mut", killerEntity, 25)
			end
		end

		if modifier == "modifier_hitter_simple_mut" then
			id.hitter_simple = id.hitter_simple + 1
			if id.hitter_simple >= 102 then
				id.hitter_simple = 102
			end
			if current_stack >= 102 then
				killerEntity:SetModifierStackCount("modifier_hitter_simple_mut", killerEntity, 102)
			end
		end
	end
end
 
Последнее редактирование модератором:
В общем мне нужно вот что: Юнит убивает крипа(слушатель уже есть) затем создается(либо уже в созданную) переменная, в которую добавляется +1.
Но дело в том, что нужно, чтобы у каждого героя эта переменная была своя и для каждого крипа тоже.
Что то наподобие id.killedEntity, тоесть PlayerOwnerId и имя крипа.
Вот код, в котором, я пытаюсь что то похожее сделать:

Ох щиииит.
Все проще, смотри:
Код:
function GameMode:OnEntityKilled( keys )
	local killedUnit = EntIndexToHScript( keys.entindex_killed )
	local killerEntity
	local killedTeam = killedUnit:GetTeam()

	if keys.entindex_attacker ~= nil then
		killerEntity = EntIndexToHScript( keys.entindex_attacker )
	end
	local killerTeam = killerEntity:GetTeam()

	local player_owner = killedEntity:GetPlayerOwner(); -- что бы у каждого игрока были свои убитые юниты

	if killedUnit and player_owner then -- если убитый юнит и игрок убийца не nil, тогда записывать в него количество убитых крипов.
		player_owner.killed_creeps = player_owner.killed_creeps or {}
		player_owner.killed_creeps[killedUnit:GetUnitName()] = (player_owner.killed_creeps[killedUnit:GetUnitName()] + 1) or 1
		--[[
			итого будет как то так:
			player.killed_creeps = {
				["npc_dota_roshan"] = 5,
				["npc_custom_blah"] = 1,
			}
		]]
	end
end
Обращаться просто, достаешься игрока от героя через
Код:
local player = hero:GetPlayerOwner();
, а после обращаешься по имени крипа
Код:
local roshan_kills = player.killed_creeps["npc_dota_roshan"];
 
Последнее редактирование модератором:
local player = hero:GetPlayerOwner();
Если привязывать инфу к хендлу игрока, то после его переподключения ты все потеряешь. Лучше использовать самого героя или по id игрока
 
Последнее редактирование модератором:
Если привязывать инфу к хендлу игрока, то после его переподключения ты все потеряешь. Лучше использовать самого героя или по id игрока
А разве плеер меняется при реконнекте оО? Незнал. Тогда да, привязывать к айдишнику.
Вместо GetPlayerOwner() использовать GetPlayerOwnerID(), и чутка изменить таблицу не на player_owner а на global_table_killed_creeps[playerid]["creep_name"]
 
Последнее редактирование модератором:
А разве плеер меняется при реконнекте оО?
Он удаляется при отключении игрока от сервера. Он же используется для связи с клиентом, а если клиента нет, то нет и надобности в объекте.
 
Последнее редактирование модератором:
CryDeS, вот я пытался подобное сделать и выдавалась ошибка, сейчас тоже выдается ошибка, я типо арифметические действия с нулем провожу, вот:
Код:
[ W VScript       ]: Script Runtime Error: scripts/vscripts/barebones.lua:622: attempt to perform arithmetic on a nil value
[ W VScript       ]: stack traceback:
[ W VScript       ]:  scripts/vscripts/barebones.lua:622: in function <scripts/vscripts/barebones.lua:609>
[ W VScript       ]: Message count limit of 10 hit. Subsequent duplicate messages will be squelched.
Код:
622.player_owner.killed_creeps[killedUnit:GetUnitName()] = (player_owner.killed_creeps[killedUnit:GetUnitName()] + 1) or 1
 
Последнее редактирование модератором:
Код:
(player_owner.killed_creeps[killedUnit:GetUnitName()] or 0) + 1
Мб так? Но лучше инициализировать значения при коннекте игрока например
 
ZLOY, заработало. Спасибо вам, но я не понял как изменить таблицу для метода GetPlayerOwnerID() :(
 
Насчет героев не знаю, а у юнитов есть свои переменные. Например эти:

x.vSpawnLoc
x.vSpawnVector

где х - это юнит. Ну и можешь их не по назначению использовать :)

Проверь на героях. Например, через абилку, которая активирует скрипт и в качестве х использует кастера. Я так крипов респавню у себя.
 
[quote author=I_GRIN_I link=topic=1049.msg5872#msg5872 date=1470841260]
ZLOY, заработало. Спасибо вам, но я не понял как изменить таблицу для метода GetPlayerOwnerID() :(
[/quote]
Я бы сделал так, если ты на протяжении игры героя менять не будешь:
Код:
local hero = PlayerResource:GetSelectedHeroEntity(killerEntity:GetPlayerOwnerID())
И к герою аттачить все данные
 
Реклама: