Недавно я столкнулся с необходимостью использовать функцию ReplaceHeroWith, и при использовании возникла вполне очевидная ситуация, героя меняет, но вместо модели героя и его вещей появилась моделька, а точнее ее отсутствие, она же ERROR.
Познакомьтесь с виспом:
Заменял его с помощью:
*Далее я буду использовать свена, для удобства
Чутка поразмыслив, не сложно догадаться что модельки не прокешированы, и нужно их прокешировать, первое что придет на ум это использовать
или же
Но и тут постиг фейл, моделька героя и стандартные шмотки загрузятся, а другие косметические(например всеми любимый дк хук) не загрузятся. Через lua пока что нельзя посмотреть какие шмотки надеты на герое, так что идем глубже и быдлокодим.
Если нельзя загрузить конкретную шмотку на героя, загрузим же их все на текущего героя.
Не секрет что шмотки(косметические) прописаны в items_game.txt
Значит необходимо загрузить этот файл, найти в нем все предметы на нашего героя(виспа) и прокешировать их по одному. Загружать оптимально при загрузке игры, что бы не тратить слишком много времени во время игры и не вызывать подлагиваний, значит кешируем сразу в Precache( contex)
Я нашел этот код на просторах гугла от автора Warchasers, но увы он положил на него свой болт, и не описал нигде функцию проверки по герою, так что пришлось быдлокодить ее.
Весь код можно разделить на несколько условных блоков:
Собственно, прокешировав все шмотки мы получим дофига потраченных ресурсов прокешированные косметические предметы на героя, для свена одного например вышло порядка 100 шмоток. Учитывая что всего в файле тысячи шмоток, то это довольно быстро делается(за доли секунды на самом деле).
Ну собственно вот и все,может быть кому то и пригодится этот быдлокод.
Спасибо автору Warchasers за реализацию большей части.
PS. Если вы создавали кастомного героя и прописывали ему шмотки, то вам не нужно это все, вам хватит простого PrecacheUnitByNameSync/PrecacheUnitByNameASync!
Скрин кода прикладываю.
Познакомьтесь с виспом:
Заменял его с помощью:
Код:
PlayerResource:ReplaceHeroWith(playerid, "npc_dota_hero_wisp", gold, 0)
Чутка поразмыслив, не сложно догадаться что модельки не прокешированы, и нужно их прокешировать, первое что придет на ум это использовать
Код:
PrecacheUnitByNameSync("npc_dota_hero_sven", function() end)
Код:
PrecacheUnitByNameASync("npc_dota_hero_sven", function() end)
Если нельзя загрузить конкретную шмотку на героя, загрузим же их все на текущего героя.
Не секрет что шмотки(косметические) прописаны в items_game.txt
Значит необходимо загрузить этот файл, найти в нем все предметы на нашего героя(виспа) и прокешировать их по одному. Загружать оптимально при загрузке игры, что бы не тратить слишком много времени во время игры и не вызывать подлагиваний, значит кешируем сразу в Precache( contex)
Я нашел этот код на просторах гугла от автора Warchasers, но увы он положил на него свой болт, и не описал нигде функцию проверки по герою
Весь код можно разделить на несколько условных блоков:
[li]чтение всего файла items_game.txt[/li]
[li]выборка из файла раннее считанного в переменную(а точнее вмассивтаблицу) только косметических предметов[/li]
[li]выборка из таблицы косметических предметов тех вещей, которые надеваются на нужных нам героев(ну или можно все грузить, и потратить минуты 2 при каждом старте игры) и пересылаем их в другую таблицу, в таблицу шмоток на кеширование[/li]
[li]собственно кеширование всех моделей из таблицы на кэширование[/li]
Код:
function Precache( context )
print('[Precache] Start')
local wearables = LoadKeyValues("scripts/items/items_game.txt") -- загружаем весь файл
local wearablesList = {} --переменная для надеваемых шмоток(для всех героев)
local precacheWearables = {} --переменная только для шмоток нужного героя
local precacheParticle = {}
for k, v in pairs(wearables) do
if k == 'items' then
wearablesList = v
end
end
local counter = 0
local counter_particle = 0
local value
for k, v in pairs(wearablesList) do -- выбираем из списка предметов только предметы на нужных героев
if IsForHero("npc_dota_hero_sven", wearablesList[k]) then
if wearablesList[k]["model_player"] then
value = wearablesList[k]["model_player"]
precacheWearables[value] = true
end
if wearablesList[k]["particle_file"] then -- прекешируем еще и частицы, куда ж без них!
value = wearablesList[k]["particle_file"]
precacheParticle[value] = true
end
end
end
for wearable,_ in pairs( precacheWearables ) do --собственно само прекеширование всех занесенных в список шмоток
print("Precache model: " .. wearable)
PrecacheResource( "model", wearable, context )
counter = counter + 1
end
for wearable,_ in pairs( precacheParticle) do --и прекеширование частиц
print("Precache particle: " .. wearable)
PrecacheResource( "particle", wearable, context )
counter_particle = counter_particle + 1
end
PrecacheUnitByNameSync("npc_dota_hero_sven", context) -- прекешируем саму модель героя! иначе будут бегать шмотки без тела
wearables = nil -- ОБНУЛЯЙТЕ ДЕТИ ПЕРЕМЕННЫЕ
wearablesList = {0} -- ОБНУЛЯЙТЕ ДЕТИ ПЕРЕМЕННЫЕ И МАССИВЫ, НЕ КУШАЙТЕ ПАМЯТИ ЛИШНЕЙ
precacheWearables = {0} -- ОБНУЛЯЙТЕ ДЕТИ ПЕРЕМЕННЫЕ И МАССИВЫ, НЕ КУШАЙТЕ ПАМЯТИ ЛИШНЕЙ
precacheParticle = {0}
print('[Precache]' .. counter .. " models loaded and " .. counter_particle .." particles loaded")
print('[Precache] End')
end
function IsForHero(str, tbl)
if type(tbl["used_by_heroes"]) ~= type(1) and tbl["used_by_heroes"] then -- привет от вашего друга, индийского быдлокодера работающего за еду
if tbl["used_by_heroes"][str] then
return true
end
end
return false
end
Ну собственно вот и все,
Спасибо автору Warchasers за реализацию большей части.
PS. Если вы создавали кастомного героя и прописывали ему шмотки, то вам не нужно это все, вам хватит простого PrecacheUnitByNameSync/PrecacheUnitByNameASync!
Скрин кода прикладываю.
Последнее редактирование модератором: