CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн I_GRIN_I

  • Продвинутый
  • 517
  • Мощь: 9
  • Научиться бы скриптить...
В общем мне нужно вот что: Юнит убивает крипа(слушатель уже есть) затем создается(либо уже в созданную) переменная, в которую добавляется +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

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
В общем мне нужно вот что: Юнит убивает крипа(слушатель уже есть) затем создается(либо уже в созданную) переменная, в которую добавляется +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"]; 


Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
local player = hero:GetPlayerOwner();
Если привязывать инфу к хендлу игрока, то после его переподключения ты все потеряешь. Лучше использовать самого героя или по id игрока

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Если привязывать инфу к хендлу игрока, то после его переподключения ты все потеряешь. Лучше использовать самого героя или по id игрока
А разве плеер меняется при реконнекте оО? Незнал. Тогда да, привязывать к айдишнику.
Вместо GetPlayerOwner() использовать GetPlayerOwnerID(), и чутка изменить таблицу не на player_owner а на global_table_killed_creeps[playerid]["creep_name"]

Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
А разве плеер меняется при реконнекте оО?
Он удаляется при отключении игрока от сервера. Он же используется для связи с клиентом, а если клиента нет, то нет и надобности в объекте.

Оффлайн I_GRIN_I

  • Продвинутый
  • 517
  • Мощь: 9
  • Научиться бы скриптить...
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

Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
Код
(player_owner.killed_creeps[killedUnit:GetUnitName()] or 0)  + 1
Мб так? Но лучше инициализировать значения при коннекте игрока например
« Последнее редактирование: 10-08-2016, 14:47:54 от ZLOY »

Оффлайн I_GRIN_I

  • Продвинутый
  • 517
  • Мощь: 9
  • Научиться бы скриптить...
ZLOY, заработало. Спасибо вам, но я не понял как изменить таблицу для метода GetPlayerOwnerID() :(

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Насчет героев не знаю, а у юнитов есть свои переменные. Например эти:

x.vSpawnLoc
x.vSpawnVector

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

 Проверь на героях. Например, через абилку, которая активирует скрипт и в качестве х использует кастера. Я так крипов респавню у себя.


Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
ZLOY, заработало. Спасибо вам, но я не понял как изменить таблицу для метода GetPlayerOwnerID() :(
Я бы сделал так, если ты на протяжении игры героя менять не будешь:
Код
local hero = PlayerResource:GetSelectedHeroEntity(killerEntity:GetPlayerOwnerID())
И к герою аттачить все данные

Оффлайн Se7eN

  • Продвинутый
  • 298
  • Мощь: 11
  • King
Код
local hero = твой герой
hero.kill = hero.kill + 1