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

[lua] Убираем все косметические предметы с героя.

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

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Иногда может понадобится убрать с героя все косметические предметы(например что бы надеть другие, или что бы не прекешировать их, экономия ресурсов же!).
Собственно весь процесс можно разбить на несколько логичных частей:
  • Выборка всех моделей с героя с классом "dota_item_wearable" и последующая запись в массив на удаление
  • Собственно, само удаление предметов.
Спойлер
Чутка отойду от темы и разберу несколько стандартных функций
Код
void UTIL_Remove(handle) -- удаляет какую либо вещь(а точнее объект, будь то модель(model), частица(particle), или же произвольный юнит (unit)) 
Дальнейшие функции рассматривают все параметры героя, будь то надетые на нем предметы или же его способности.
Код
handle FirstMoveChild() -- возвращает первый указатель на часть содержащуюся в другом обьекте(в нашем примере она будет возвращать класс, который мы и будем проверять на совпадения его названия с "dota_item_wearable")
Код
handle NextMovePeer() --то же что и предыдущая, только возвращает не первый указатель, а следующий(по порядку)
Код
string GetClassname() - возвращает название класса по указателю на объект(смотри дальше по примеру)
Код
#TABLE - выдаст длинну TABLE
[свернуть]

Собственно сама функция:
Код
function RemoveWearables(hero)
    print('#RemoveWearables')
    local wearables = {} -- объявление локального массива на удаление
    local cur = hero:FirstMoveChild() -- получаем первый указатель над подобъект объекта hero ()

    while cur ~= nil do --пока наш текущий указатель не равен nil(пустота/пустой указатель)
        cur = cur:NextMovePeer() -- выбираем следующий указатель на подобъект нашего обьекта
        if cur ~= nil and cur:GetClassname() ~= "" and cur:GetClassname() == "dota_item_wearable" then -- проверяем, елси текущий указатель не пуст, название класса не пустое, и если этот класс есть класс "dota_item_wearable", то есть надеваемые косметические предметы
            table.insert(wearables, cur) -- добавляем в таблицу на удаление текущий предмет(сверху проверяли класс текущего объекта)
        end
    end
 
    for i = 1, #wearables do -- собственно цикл для удаления всего занесенного в массив на удаление
        UTIL_Remove(wearables[i]) -- удаляем объект
    end
end
Собственно используя данную функцию можно очистить нужного героя от всех косметических предметов.
Когда это может понадобится? Например когда вы заменяете модель одного героя, на другую.
Например я заменил модель бруды на модель антимага без удаления косметических предметов, и вышло ЭТО:
Спойлер
[свернуть]
PS. hero - объект героя, не его имя
PSS. Автор данной функции некий Noya, я только разжевал ее по частям.

Оффлайн -ExotiC-

  • Администратор
  • 350
  • Мощь: 3
  • Забанен
Спасибо, добавил на главную

Оффлайн doter.ua

  • Друзья CG
  • 272
  • Мощь: 1
Годная адаптация гайда.
гайды
сурпрайз mthfckr :D

[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Годная адаптация гайда.
Гайд написал я, просто функцию написал не я :D Гайда нету на других ресурсах( я не нашел по крайней мере)

Оффлайн doter.ua

  • Друзья CG
  • 272
  • Мощь: 1
CryDeS,  Годный reverse engineering :)
гайды
сурпрайз mthfckr :D

[свернуть]

Оффлайн wetalq

  • 30
  • Мощь: 0
Этот скрипт вставлять в addon_game_mode.lua, а в качестве аргумента функции писать npc_dota_hero_omniknight если хочу снять вещи с Омника ?

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Этот скрипт вставлять в addon_game_mode.lua, а в качестве аргумента функции писать npc_dota_hero_omniknight если хочу снять вещи с Омника ?
Вставлять туда куда полезет, не обязательно в addon_game_mode.
И нет, передавать не имя героя, а объект героя, который уже в игре существует.

Оффлайн wetalq

  • 30
  • Мощь: 0
Вставлять туда куда полезет, не обязательно в addon_game_mode.
И нет, передавать не имя героя, а объект героя, который уже в игре существует.

можешь показать пример как его активировать ?
я так понимаю во время выбора героя, на герое будут надеты все косметические предметы ?

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
можешь показать пример как его активировать ?
я так понимаю во время выбора героя, на герое будут надеты все косметические предметы ?
Правильно понимаешь друг.
В InitGameMode слушателя добавь на пик героя
Код
ListenToGameEvent("dota_player_pick_hero", Dynamic_Wrap(GameMode, "OnHeroPicked"), self)
А в сам обработчик слушателя:
Код
function GameMode:OnHeroPicked (event)
    local hero = EntIndexToHScript(event.heroindex)
if hero then 
              RemoveWearables(hero)
    end

print("Hero picked, hero:" .. hero:GetUnitName())
PrecacheUnitByNameAsync(hero:GetUnitName(), function() end) -- это у меня в гейммоде требуется штука, у себя можешь убрать
end
PS. GameMode имя твоего мода из Activate()

Оффлайн wetalq

  • 30
  • Мощь: 0
Правильно понимаешь друг.
В InitGameMode слушателя добавь на пик героя
Код
ListenToGameEvent("dota_player_pick_hero", Dynamic_Wrap(GameMode, "OnHeroPicked"), self)
А в сам обработчик слушателя:
Код
function GameMode:OnHeroPicked (event)
    local hero = EntIndexToHScript(event.heroindex)
if hero then 
              RemoveWearables(hero)
    end

print("Hero picked, hero:" .. hero:GetUnitName())
PrecacheUnitByNameAsync(hero:GetUnitName(), function() end) -- это у меня в гейммоде требуется штука, у себя можешь убрать
end
PS. GameMode имя твоего мода из Activate()

Сделал вот так

Код
function Activate()
GameRules.AddonTemplate = CAddonTemplateGameMode()
GameRules.AddonTemplate:InitGameMode()
end

function CAddonTemplateGameMode:InitGameMode()
print( "Template addon is loaded." )
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
ListenToGameEvent("dota_player_pick_hero", Dynamic_Wrap(CAddonTemplateGameMode, "OnHeroPicked"), self)
end

function CAddonTemplateGameMode:OnHeroPicked (event)
    local hero = EntIndexToHScript(event.heroindex)
if hero then 
              RemoveWearables(hero)
    end

print("Hero picked, hero:" .. hero:GetUnitName())

end

function RemoveWearables(hero)
    print('#RemoveWearables')
    local wearables = {} -- объявление локального массива на удаление
    local cur = hero:FirstMoveChild() -- получаем первый указатель над подобъект объекта hero ()

    while cur ~= nil do --пока наш текущий указатель не равен nil(пустота/пустой указатель)
        cur = cur:NextMovePeer() -- выбираем следующий указатель на подобъект нашего обьекта
        if cur ~= nil and cur:GetClassname() ~= "" and cur:GetClassname() == "dota_item_wearable" then -- проверяем, елси текущий указатель не пуст, название класса не пустое, и если этот класс есть класс "dota_item_wearable", то есть надеваемые косметические предметы
            table.insert(wearables, cur) -- добавляем в таблицу на удаление текущий предмет(сверху проверяли класс текущего объекта)
        end
    end
 
    for i = 1, #wearables do -- собственно цикл для удаления всего занесенного в массив на удаление
        UTIL_Remove(wearables[i]) -- удаляем объект
    end
end

в Addon_Game_Mode.lua

в игре пишет вот такого плана ошибку


Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Сделал вот так

Код
function Activate()
GameRules.AddonTemplate = CAddonTemplateGameMode()
GameRules.AddonTemplate:InitGameMode()
end

function CAddonTemplateGameMode:InitGameMode()
print( "Template addon is loaded." )
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
ListenToGameEvent("dota_player_pick_hero", Dynamic_Wrap(CAddonTemplateGameMode, "OnHeroPicked"), self)
end

function CAddonTemplateGameMode:OnHeroPicked (event)
    local hero = EntIndexToHScript(event.heroindex)
if hero then 
              RemoveWearables(hero)
    end

print("Hero picked, hero:" .. hero:GetUnitName())

end

function RemoveWearables(hero)
    print('#RemoveWearables')
    local wearables = {} -- объявление локального массива на удаление
    local cur = hero:FirstMoveChild() -- получаем первый указатель над подобъект объекта hero ()

    while cur ~= nil do --пока наш текущий указатель не равен nil(пустота/пустой указатель)
        cur = cur:NextMovePeer() -- выбираем следующий указатель на подобъект нашего обьекта
        if cur ~= nil and cur:GetClassname() ~= "" and cur:GetClassname() == "dota_item_wearable" then -- проверяем, елси текущий указатель не пуст, название класса не пустое, и если этот класс есть класс "dota_item_wearable", то есть надеваемые косметические предметы
            table.insert(wearables, cur) -- добавляем в таблицу на удаление текущий предмет(сверху проверяли класс текущего объекта)
        end
    end
 
    for i = 1, #wearables do -- собственно цикл для удаления всего занесенного в массив на удаление
        UTIL_Remove(wearables[i]) -- удаляем объект
    end
end

в Addon_Game_Mode.lua

в игре пишет вот такого плана ошибку

Добавь проверку на IsHero

Оффлайн nyaWmint

  • 1
  • Мощь: 0
  • xd
Добавь проверку на IsHero

Можно по-подробнее про эту проверку (прост новичок в lua  :-\)

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Можно по-подробнее про эту проверку (прост новичок в lua  :-\)
developer.valvesoftware.com/...C.IsHero

Оффлайн GooDDarL

  • 6
  • Мощь: 0
Добавь проверку на IsHero

А как и куда ее впиндюрить?   :-[

Оффлайн MahouShoujo

  • Продвинутый
  • 202
  • Мощь: 3
Юзлесс. Может отдаленно пригодиться только если нужно удалять в рантайме.

"DisableWearables" "1"