PrecacheUnitByNameSync как правильно его использовать?

Novichek

Активный
18 Фев 2020
123
14
Проект
Evo Land
несколько дней мучаюсь вопросом: А как правильно юзать
PrecacheUnitByNameSync
или
PrecacheUnitByNameAsync
Мне нужно для игрока заприкешит героя с шмотками (что бы не прикешит всю папку в начале игры к примеру
PrecacheResource("model_folder", "models/items/drow", context))
но я не понимаю что куда и зачем. Могу передать имя героя и id игрока, без проблем но что еще нужно?
вот пример моего кода где я пытаюсь это настроить

Lua:
function AddHeroPickAbilities(keys)
    local caster = keys.caster
    local heroName = "npc_dota_hero_drow_ranger"
    local playerID = caster:GetPlayerID()  -- Получаем ID игрока
    if caster:GetUnitName() ~= heroName then
        local ismodifier_auto_pick_up = 0
        if caster:HasModifier( "modifier_auto_pick_up" ) then
            ismodifier_auto_pick_up = 1
        end
        local items = {}
        for i = DOTA_ITEM_SLOT_1, DOTA_ITEM_SLOT_9 do
            local item = caster:GetItemInSlot(i)
            if item then
                local itemName = item:GetName()
                local charges = item:GetCurrentCharges()
                table.insert(items, {slot = i, name = itemName, charges = charges})
            end
        end
        for i = DOTA_STASH_SLOT_1, DOTA_STASH_SLOT_6 do
            local item = caster:GetItemInSlot(i)
            if item then
                local itemName = item:GetName()
                local charges = item:GetCurrentCharges()
                table.insert(items, {slot = i, name = itemName, charges = charges})
            end
        end
        do
            local item = caster:GetItemInSlot(DOTA_ITEM_NEUTRAL_SLOT)
            if item then
                local itemName = item:GetName()
                local charges = item:GetCurrentCharges()
                table.insert(items, {slot = DOTA_ITEM_NEUTRAL_SLOT, name = itemName, charges = charges})
            end
        end
        local currentGold = caster:GetGold()
        local previousHeroLevel = caster:GetLevel()
        PrecacheUnitByNameAsync(heroName, function()
            local hero = PlayerResource:ReplaceHeroWith(caster:GetPlayerID(), heroName, currentGold, 0)
        end, playerID)
        
        UTIL_Remove(caster)
        if ismodifier_auto_pick_up == 1 then
            hero:AddNewModifier(hero, nil, "modifier_auto_pick_up", {})
        end
        
        for _, itemData in pairs(items) do
            local item = CreateItem(itemData.name, hero, hero)
            if itemData.charges then
                item:SetCurrentCharges(itemData.charges)
            end
            if itemData.slot >= DOTA_STASH_SLOT_1 and itemData.slot <= DOTA_STASH_SLOT_6 then
                hero:AddItem(item)
            end
        end
        Timers:CreateTimer(0.3, function()
            local soundName = "echo_slam_arcana1"
            EmitSoundOn(soundName, caster)
            local particle = ParticleManager:CreateParticle("particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start.vpcf", PATTACH_CUSTOMORIGIN, hero)
            ParticleManager:SetParticleControl(particle, 0, hero:GetAbsOrigin())
            ParticleManager:SetParticleControl(particle, 3, hero:GetAbsOrigin())
            ParticleManager:ReleaseParticleIndex(particle)
        end)
    end
end
сама моделька героя ест но вот шмоток на ней нет...
 
Странно конечно. У меня шмотки подгружает, и для этого достаточно было playerID указать
 
Странно конечно. У меня шмотки подгружает, и для этого достаточно было playerID указать
ну я на всякий скинул код мало ли что то не то сделал но у меня фиолетовый эррор под моделькой. Асинхронный не асинхронный че я только не пробовал. По гиту лазил почти каждый пример пробовал хотя они одинаковые почти. Ничего не получается, вот я и думаю может быт у меня базовая ошибка что и заметить сложно))
 
Может что то с утилитами свазанно? нужно туда что то добавить? Скачал базовые утилиты но там ничего нет они не конфликтуют.
 
и я еще заметил что принты не срабатывают в функции обратного вызова. При этом реплейс хиро выполняется. Вообще чет непонятное
 
Реклама: