Дроп с мобов

Owletass

Пользователь
21 Авг 2014
57
1
Хочу сделать так, чтобы когда умирает крип, то с него падала вещь с некоторым шансом.
 

-ExotiC-

Какой-то ноунэйм
Команда форума
11 Авг 2014
498
56
customgames.ru
Owletass, через скрипты реализуется. Отслеживаешь смерть моба, через рандом (для некоторого шанса) создаешь на точке смерти предмет.

entity_killed

  • [li]entindex_killed(long)[/li]
    [li]entindex_attacker (long)[/li]
    [li]entindex_inflictor (long)[/li]
    [li]damagebits (long)[/li]
 

Owletass

Пользователь
21 Авг 2014
57
1
[quote author=-ExotiC- link=topic=24.msg94#msg94 date=1408893721]
Owletass, через скрипты реализуется. Отслеживаешь смерть моба, через рандом (для некоторого шанса) создаешь на точке смерти предмет.

entity_killed

  • [li]entindex_killed( long )[/li]
    [li]entindex_attacker ( long )[/li]
    [li]entindex_inflictor ( long )[/li]
    [li]damagebits ( long )[/li]
[/quote]
Это всё и так было ясно. Дело в том, что я не могу реализовать это. Помоги, если не сложно.
 

doter.ua

Продвинутый
17 Авг 2014
280
5
Хочу сделать так, чтобы когда умирает крип, то с него падала вещь с некоторым шансом.

фнкция умер крип(keys)
local Guf = EntIndexToHScript(keys.entindex_killed)
local myItem = CreateItem("item_aegis", nil, nil)
CreateItemOnPositionSync(Guf:GetAbsOrigin(), myItem)
энд

шанс: например if RandomInt(1, 10) > 3 then ... else ... end Насколько я помню по комбинаторике шанс равен 7\10 = 70% ( 7 из 10 чисел "> 3")
 
Последнее редактирование модератором:

Owletass

Пользователь
21 Авг 2014
57
1
[quote author=doter.ua link=topic=24.msg123#msg123 date=1409038459]
фнкция умер крип(keys)
local Guf = EntIndexToHScript(keys.entindex_killed)
local myItem = CreateItem("item_aegis", nil, nil)
CreateItemOnPositionSync(Guf:GetAbsOrigin(), myItem)
энд

шанс: например if RandomInt(1, 10) > 3 then ... else ... end Насколько я помню по комбинаторике шанс равен 7\10 = 70% ( 7 из 10 чисел "> 3")
[/quote]

Извини, но я не знаю, что с этим делать.

Закинул этот код в addon_name_mod.lua и, кажется, заработало.

function DotaPvP:eek:nEntityKilled(keys)
if RandomInt(3, 100) > 3 then
else local Guf = EntIndexToHScript(keys.entindex_killed)
local myItem = CreateItem("item_aegis", nil, nil)
CreateItemOnPositionSync(Guf:GetAbsOrigin(), myItem)
end
end
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Ребят, у меня похожий вопрос: как узнать, что умер монстр конкретного типа?

Вот тут, например, узнаем индекс умершего монстра.
Код:
local killedEntity = EntIndexToHScript(event.entindex_killed)
Далее я бы мог сравнить его с необходимым для выполнения условия индексом, но где мне его взять?

Как мне узнать индекс моего кастомного монстра, который называется "cow"?
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Все, разобрался. Нашел где-то на просторах инета такой вот метод GetUnitName().

Кому интересно, вот в итоге код обработчика:

Код:
 function OnEntityKilled (event)
  local killedEntity = EntIndexToHScript(event.entindex_killed)
  if killedEntity:GetUnitName() == "cow" then
   CreateDrop("item_flask", killedEntity:GetAbsOrigin())
  end
 end
 
Последнее редактирование модератором:

shizik1_shizik2

Активный
5 Июн 2023
72
3
Все, разобрался. Нашел где-то на просторах инета такой вот метод GetUnitName().

Кому интересно, вот в итоге код обработчика:

Код:
 function OnEntityKilled (event)
  local killedEntity = EntIndexToHScript(event.entindex_killed)
  if killedEntity:GetUnitName() == "cow" then
   CreateDrop("item_flask", killedEntity:GetAbsOrigin())
  end
end
блин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нет
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
блин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нет
А ты зарегистрировал слушаетеля, прежде чем назначить на него функцию? Вот эта строчка должна быть внутри InitGameMode
ListenToGameEvent( "entity_killed", Dynamic_Wrap( CAddonTemplateGameMode, "OnEntityKilled" ), self )
И соответственно название функции должно быть CAddonTemplateGameMode:OnEntityKilled
Было бы проще помочь, если б ты сразу кидал весь свой код, который вставил)
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
блин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нет
ещё я что-то в api доты не нашёл функцию CreateDrop, используй вместо неё DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
Надо чтобы у убитого юнита был в инвентаре нужный предмет, и собственно item=killedEntity:FindItemInInventory("item_flask")
 

shizik1_shizik2

Активный
5 Июн 2023
72
3
ещё я что-то в api доты не нашёл функцию CreateDrop, используй вместо неё DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
Надо чтобы у убитого юнита был в инвентаре нужный предмет, и собственно item=killedEntity:FindItemInInventory("item_flask")
всё равно не помогло вроде всё без ошибок записал
Код:
if nestle == nil then
    nestle = class({})
end

-- Create the game mode when we activate
function Activate()
      nestle:InitGameMode()
end



function nestle:InitGameMode()
    print( "Template addon is loaded." )
    GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
GameRules:SetGoldTickTime(1)
GameRules:SetGoldPerTick(2)
GameRules:SetStartingGold(1500)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 3)
GameRules:GetGameModeEntity():SetFreeCourierModeEnabled(true)
GameRules:IsHeroRespawnEnabled(30)
GameRules:SetCreepSpawningEnabled(true)
GameRules:SetSafeToLeave(true)
GameRules:GetGameModeEntity():SetThink("OnThink", self, 1)
GameRules:SetUseUniversalShopMode(true)

 ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle)
end


-- Evaluate the state of the game
function nestle:OnThink()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        --print( "Template addon script is running." )
    elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    end
    return 1
end





function nestle:OnThink()
    if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    elseif GameRules:State_Get() ~= DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        return 1
    end

    for _, hero in pairs(HeroList:GetAllHeroes()) do
        self:onThinkHero(hero)
     end

    return 1
end




function nestle:onThinkHero(hero)
  local team = hero:GetTeamNumber()
  hero:AddExperience(10, DOTA_ModifyXP_Unspecified, false, true)
end

function nestle:OnEntityKilled( data )
    local killedEntity = EntIndexToHScript( data.entindex_killed )
    item = killedEntity:FindItemInInventory("item_dagon_6")
    if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then   
        DropItemAtPosition(killedEntity:GetAbsOrigin(), item)


     end
end
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
всё равно не помогло вроде всё без ошибок записал
Код:
if nestle == nil then
    nestle = class({})
end

-- Create the game mode when we activate
function Activate()
      nestle:InitGameMode()
end



function nestle:InitGameMode()
    print( "Template addon is loaded." )
    GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
GameRules:SetGoldTickTime(1)
GameRules:SetGoldPerTick(2)
GameRules:SetStartingGold(1500)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 3)
GameRules:GetGameModeEntity():SetFreeCourierModeEnabled(true)
GameRules:IsHeroRespawnEnabled(30)
GameRules:SetCreepSpawningEnabled(true)
GameRules:SetSafeToLeave(true)
GameRules:GetGameModeEntity():SetThink("OnThink", self, 1)
GameRules:SetUseUniversalShopMode(true)

ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle)
end


-- Evaluate the state of the game
function nestle:OnThink()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        --print( "Template addon script is running." )
    elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    end
    return 1
end





function nestle:OnThink()
    if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    elseif GameRules:State_Get() ~= DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        return 1
    end

    for _, hero in pairs(HeroList:GetAllHeroes()) do
        self:onThinkHero(hero)
     end

    return 1
end




function nestle:onThinkHero(hero)
  local team = hero:GetTeamNumber()
  hero:AddExperience(10, DOTA_ModifyXP_Unspecified, false, true)
end

function nestle:OnEntityKilled( data )
    local killedEntity = EntIndexToHScript( data.entindex_killed )
    item = killedEntity:FindItemInInventory("item_dagon_6")
    if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then 
        DropItemAtPosition(killedEntity:GetAbsOrigin(), item)


     end
end
Когда ошибка находится в функции InitGameMode или в любой другой, которая вызывается при запуске кастомки, сообщение об ошибке в консоли улетает далеко вверх
В твоём коде ошибка скорее всего в регистрации слушателя, в старых гайдах описан нерабочий формат ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle), сейчас нужно так
ListenToGameEvent( "entity_killed", Dynamic_Wrap(nestle, "OnEntityKilled" ), self )
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Вообще готовая система для дропа шмоток есть уже тут
 
  • Нравится
Реакции: fabio_longo

shizik1_shizik2

Активный
5 Июн 2023
72
3
Когда ошибка находится в функции InitGameMode или в любой другой, которая вызывается при запуске кастомки, сообщение об ошибке в консоли улетает далеко вверх
В твоём коде ошибка скорее всего в регистрации слушателя, в старых гайдах описан нерабочий формат ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle), сейчас нужно так
ListenToGameEvent( "entity_killed", Dynamic_Wrap(nestle, "OnEntityKilled" ), self )
всё равно не работает я посмотрел в консоли мне выводит ошибку на 7 и 8 строчку
function Activate()
nestle:InitGameMode()
и на GameRules:IsHeroRespawnEnabled(30) (типо 2 аргумента должно быть) но предмет всё равно не выпадает
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
всё равно не работает я посмотрел в консоли мне выводит ошибку на 7 и 8 строчку
function Activate()
nestle:InitGameMode()
и на GameRules:IsHeroRespawnEnabled(30) (типо 2 аргумента должно быть) но предмет всё равно не выпадает
В функции Activate у тебя должно быть 2 строчки:
GameRules.AddonTemplate = nestle()
GameRules.AddonTemplate:InitGameMode()

Если в функции InitGameMode будет ошибка, то последующие строчки после неё не будут исполняться. Такой уж язык - lua. У тебя проблема в том, что ты даёшь аргумент, который не требуется. Конкретно строка IsHeroRespawnEnabled() не способна установить какой-то геймрул, она возвращает true false - включён ли в игре респавн героев. Возможно тебе подойдёт SetFixedRespawnTime(fixedRespawnTime: float)
 

shizik1_shizik2

Активный
5 Июн 2023
72
3
В функции Activate у тебя должно быть 2 строчки:
GameRules.AddonTemplate = nestle()
GameRules.AddonTemplate:InitGameMode()

Если в функции InitGameMode будет ошибка, то последующие строчки после неё не будут исполняться. Такой уж язык - lua. У тебя проблема в том, что ты даёшь аргумент, который не требуется. Конкретно строка IsHeroRespawnEnabled() не способна установить какой-то геймрул, она возвращает true false - включён ли в игре респавн героев. Возможно тебе подойдёт SetFixedRespawnTime(fixedRespawnTime: float)
теперь выдаёт ошыбку на саму функцию вызываемую слушателем и на DropItemAtPosition(killedEntity:GetAbsOrigin(), item)

function nestle:OnEntityKilled( data )
local killedEntity = EntIndexToHScript( data.entindex_killed )
item = killedEntity:FindItemInInventory("item_dagon_6")
if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then
DropItemAtPosition(killedEntity:GetAbsOrigin(), item)


end
end
 

fabio_longo

Продвинутый
13 Июн 2021
152
18
steamcommunity.com
Проект
Chen's Training, Creep Stacking Training
теперь выдаёт ошыбку на саму функцию вызываемую слушателем и на DropItemAtPosition(killedEntity:GetAbsOrigin(), item)

function nestle:OnEntityKilled( data )
local killedEntity = EntIndexToHScript( data.entindex_killed )
item = killedEntity:FindItemInInventory("item_dagon_6")
if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then
DropItemAtPosition(killedEntity:GetAbsOrigin(), item)


end
end
Покопался в шаблоне Виталика, можешь сделать так
local newItem = CreateItem( "item_dagon_6", nil, nil )
local drop = CreateItemOnPositionForLaunch( killedEntity:GetAbsOrigin(), newItem )
 
Реклама: