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

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

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

Оффлайн den4iccc

  • 302
  • Мощь: 4
Слушатель для ForceKill()
« : 24-07-2017, 00:45:19 »
Есть два скрипта 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 описанный выше ?

Оффлайн gameizeazy

  • 106
  • Мощь: 1
Re: Слушатель для ForceKill()
« Ответ #1 : 24-07-2017, 01:20:47 »
Код
function roflanKill( keys )
 -- типо keys.caster:forcekill(false)
 -- типо CreateDrop(..., ... )
end

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #2 : 24-07-2017, 01:24:12 »
Код
function roflanKill( keys )
 -- типо keys.caster:forcekill(false)
 -- типо CreateDrop(..., ... )
end

Нет, ты не правильно понял, слушатель не реагирует на мгновенную смерть, а реагирует на смерть от скила, героя, npc и т д, я написал что у меня 2 скрипта 1- исполнительный файл где происходит проверка и если условие истинное то происходит мгновенная смерть, а 2 - глобальный - OnHeroKilled который чекает если какой нибудь герой умрёт то выполнится действие (GameMode:CreateDrop(name, position))
« Последнее редактирование: 24-07-2017, 01:39:26 от den4iccc »

Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
Re: Слушатель для ForceKill()
« Ответ #3 : 24-07-2017, 06:35:40 »
entity_killed

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #4 : 24-07-2017, 07:09:50 »
entity_killed
Спасибо, всё работает сделал через ListenToGameEvent("entity_killed", Dynamic_Wrap(GameMode, "OnHeroKilled"), self) и заменил local killedEntity = PlayerResource:GetSelectedHeroEntity(data.PlayerID) на local killedEntity = EntIndexToHScript(data.entindex_killed) но entindex_killed вроде в частности относится к мобам и вообще корректно ли использовать entindex_killed для героев ?

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #5 : 24-07-2017, 07:13:13 »
и ещё вопрос что лучше использовать GetSelectedHeroEntity (вместе с GetPlayerID и GetPlayerOwner для определения) или GetAssignedHero

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #6 : 24-07-2017, 07:32:36 »
Блин он всё таки выдаёт ошибку если убит npc

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #7 : 24-07-2017, 07:33:31 »
Пришлось делать проверку IsHero() что бы крипы не крашались. Кроме dota_player_killed нет слушателя который бы проверял только героя ?
« Последнее редактирование: 24-07-2017, 07:41:29 от den4iccc »

Оффлайн ZLOY

  • Супермодератор
  • 395
  • Мощь: 5
Re: Слушатель для ForceKill()
« Ответ #8 : 24-07-2017, 07:46:03 »
А чем проверка плоха? И лучше IsRealHero использовать.

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #9 : 24-07-2017, 07:49:06 »
А чем проверка плоха? И лучше IsRealHero использовать.

Мне кажется что я за "говнокодил":))) Использовать "не предназначенное" и абстрагироваться, за IsRealHero спасибо
« Последнее редактирование: 24-07-2017, 07:53:39 от den4iccc »

Оффлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: Слушатель для ForceKill()
« Ответ #10 : 24-07-2017, 09:22:19 »
.... но entindex_killed вроде в частности относится к мобам и вообще корректно ли использовать entindex_killed для героев ?

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

Поэтому ты не говнокодишь, когда используешь entindex_killed и внутри ставишь свои фильтры. Наоборот, так даже лучше и гибче, меньше ошибок будет.

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #11 : 24-07-2017, 09:44:45 »
Нет, это события отлавливает смерть любой сущности на карте. И герой у игрока входит в эту групп (крип).
dota_player_killed - работает, насколько я помню, через ту же самую entindex_killed, просто применяя всевозможные фильтры за тебя.

Поэтому ты не говнокодишь, когда используешь entindex_killed и внутри ставишь свои фильтры. Наоборот, так даже лучше и гибче, меньше ошибок будет.
Спасибо за инфу, просветил)

Оффлайн MahouShoujo

  • Продвинутый
  • 188
  • Мощь: 3
Re: Слушатель для ForceKill()
« Ответ #12 : 24-07-2017, 13:40:31 »
dota_player_killed как раз обертка над entity_killed скорее всего. Тебе она не подошла, написал свою.

Оффлайн I_GRIN_I

  • Продвинутый
  • 517
  • Мощь: 9
  • Научиться бы скриптить...
Re: Слушатель для ForceKill()
« Ответ #13 : 24-07-2017, 19:23:43 »
den4iccc, к слову, геймизизи предлагал тебе просто в самой функции, где условие, создавать дроп.

Оффлайн den4iccc

  • 302
  • Мощь: 4
Re: Слушатель для ForceKill()
« Ответ #14 : 25-07-2017, 04:41:59 »
den4iccc, к слову, геймизизи предлагал тебе просто в самой функции, где условие, создавать дроп.
Тогда бы мне пришлось создавать ещё несколько функций чтобы задействовать другие скрипты или ещё 1 глобалку делать)