Слушатель для ForceKill()

den4iccc

Друзья CG
20 Сен 2014
440
1
Проект
Survival in Taiga XE
Есть два скрипта 1-ый выполняет ForceKill() если выполнено условие, 2-ой CreateItemOnPositionSync() если
Код:
ListenToGameEvent("dota_player_killed", Dynamic_Wrap(GameMode, "OnHeroKilled"), self)
значит дропаются итемы из инвентаря. Код взял с форума (Кодим функции: "дроп с игрока" или "будьте внимательнее" от Ильи)

Код:
function GameMode:OnHeroKilled(data)
print("Hero Killed")
	local killedEntity = PlayerResource:GetSelectedHeroEntity(data.PlayerID)
  if killedEntity:GetNumItemsInInventory() ~=0 then
	  for i=0,5 do
			local item = killedEntity:GetItemInSlot(i);
			if item ~= nil then
				local position = killedEntity:GetAbsOrigin()
				local name = item:GetAbilityName()
				killedEntity:RemoveItem(item)				
				GameMode:CreateDrop(name, position)
			end
		end
  end
	
end

function GameMode:CreateDrop (itemName, pos)
  local newItem = CreateItem(itemName, nil, nil)
  newItem:SetPurchaseTime(0)
  CreateItemOnPositionSync(pos, newItem)
  newItem:LaunchLoot(false, 300, 0.75, pos + RandomVector(RandomFloat(50, 350)))
end

(если убить игрока или убить его какой нибудь пасивкой/скилом то предметы дропаются)
При выполнении условия срабатывает ForceKill(), но dota_player_killed не считает его за смерть, то есть если ForceKill() срабатывает то предметы не дропаются (по условию "CreateDrop"). Можно ли как нибудь совместить мгновенную смерть и OnHeroKilled описанный выше ?
 
Последнее редактирование модератором:
Код:
function roflanKill( keys )
 -- типо keys.caster:forcekill(false)
 -- типо CreateDrop(..., ... )
end
 
[quote author=gameizeazy link=topic=1628.msg10710#msg10710 date=1500859247]
Код:
function roflanKill( keys )
 -- типо keys.caster:forcekill(false)
 -- типо CreateDrop(..., ... )
end
[/quote]

Нет, ты не правильно понял, слушатель не реагирует на мгновенную смерть, а реагирует на смерть от скила, героя, npc и т д, я написал что у меня 2 скрипта 1- исполнительный файл где происходит проверка и если условие истинное то происходит мгновенная смерть, а 2 - глобальный - OnHeroKilled который чекает если какой нибудь герой умрёт то выполнится действие (GameMode:CreateDrop(name, position))
 
Спасибо, всё работает сделал через ListenToGameEvent("entity_killed", Dynamic_Wrap(GameMode, "OnHeroKilled"), self) и заменил local killedEntity = PlayerResource:GetSelectedHeroEntity(data.PlayerID) на local killedEntity = EntIndexToHScript(data.entindex_killed) но entindex_killed вроде в частности относится к мобам и вообще корректно ли использовать entindex_killed для героев ?
 
Последнее редактирование модератором:
и ещё вопрос что лучше использовать GetSelectedHeroEntity (вместе с GetPlayerID и GetPlayerOwner для определения) или GetAssignedHero
 
Блин он всё таки выдаёт ошибку если убит npc
 
Пришлось делать проверку IsHero() что бы крипы не крашались. Кроме dota_player_killed нет слушателя который бы проверял только героя ?
 
А чем проверка плоха? И лучше IsRealHero использовать.
 
А чем проверка плоха? И лучше IsRealHero использовать.
Мне кажется что я за "говнокодил":))) Использовать "не предназначенное" и абстрагироваться, за IsRealHero спасибо
 
Последнее редактирование модератором:
.... но entindex_killed вроде в частности относится к мобам и вообще корректно ли использовать entindex_killed для героев ?

Нет, это события отлавливает смерть любой сущности на карте. И герой у игрока входит в эту групп (крип).
dota_player_killed - работает, насколько я помню, через ту же самую entindex_killed, просто применяя всевозможные фильтры за тебя.

Поэтому ты не говнокодишь, когда используешь entindex_killed и внутри ставишь свои фильтры. Наоборот, так даже лучше и гибче, меньше ошибок будет.
 
Последнее редактирование модератором:
Нет, это события отлавливает смерть любой сущности на карте. И герой у игрока входит в эту групп (крип).
dota_player_killed - работает, насколько я помню, через ту же самую entindex_killed, просто применяя всевозможные фильтры за тебя.

Поэтому ты не говнокодишь, когда используешь entindex_killed и внутри ставишь свои фильтры. Наоборот, так даже лучше и гибче, меньше ошибок будет.
Спасибо за инфу, просветил)
 
Последнее редактирование модератором:
dota_player_killed как раз обертка над entity_killed скорее всего. Тебе она не подошла, написал свою.
 
den4iccc, к слову, геймизизи предлагал тебе просто в самой функции, где условие, создавать дроп.
 
[quote author=I_GRIN_I link=topic=1628.msg10726#msg10726 date=1500924223]
den4iccc, к слову, геймизизи предлагал тебе просто в самой функции, где условие, создавать дроп.
[/quote]
Тогда бы мне пришлось создавать ещё несколько функций чтобы задействовать другие скрипты или ещё 1 глобалку делать)
 
Реклама: