Психологически легче так.
Комменты тоже есть.
Меня главное, что интересует, не будет ли считаться, что кода типа "больше" (мб там еще больше функций придётся прелоадить) или таки пробелы заигнорятся?
Кет, ну можно, просто тогда для каждого саундсета свой глобальный массив надо.
Это вообще само по себе "особое" решение, знаю, должны нормально быть кастомные саундсеты =/
Если кому не влом, киньте, плз, тут линки еще раз на то, как свои саундсеты делать, у меня будет уже по ссылкам прямо перебираться с блога сюда, а тут по линкам туда и постепенно мб раскурю.
//////////
Ну нихрена пока не понятно еще, короче, в тест-карте прописано при запуске проигрывать все звуки Картуса с громкостью 0, ВРОДЕ СЕЙЧАС КАЖЕТСЯ, что все отлично (тот триг, что был выше, абсолютно не изменился, ща отталкиваюсь от того, что задача - спрелоадить звуки), но это не показатель, потому что минимум 1-2 раза уже так точно "казалось" после экспериментов с параметрами, а потом снова замечались подлагивания, ладно, после импорта в основные карты этого "прелоада" будет видно.
/////////
Ага, вот про звуковые сеты
Когда-нить мб пригодится
ТАК! Ну расклад такой. Сейчас протестировалась уже оптимизированная карта.
В общем, дело такое: поставлено проигрывать все звуки Картуса в начале одного триггера (на старте буквально сразу). В этот момент ощущается четкий сильный лаг, а потом пока лагов замечено не было.
Так что да, ятп, суть в необходимости прелоада.
Офк один "типа лаг" вначале в тысячу раз лучше небольших лагов в процессе геймплея. Но проблема в том, что если дальше делать так, то он будет только расти и расти. Можно ли прелоадить без лага? Ну не нахожу ничего, кроме вот той ссылки, и там вроде не то. Или только дораскуривать создание своих саундсетов через потрошение варкрафта?
NilasAran_39, нет, он не уберет так, статус все равно действительно останется, у аур бафф убрать можно только вместе с эффектом ауры (и, как правило, и с ней самой тоже). Sen-smit, ну скорость перемещения можно в процентах триггерно, а скорость боя на основе предмета-перчатки менять, это просто наводка
////
Кстати, может, без триггеров и получится. Посмотри, че делает Техника гоблина-механика, там точно можно апать мс, только не помню, в процентах или нет. А скорость атаки можно сделать одной из улучшаемых ей абил, например, на основе тех же перчаток скорости.
А тебе точно надо именно в процентах и именно без баффа? Все-таки аура выносливости только на себя - действительно очень удобный вариант, только единственное, что с баффом. Чем бафф так мешает?
Hate, так мб уже определимся, проблема в коде или в отсутствии прелоада звука.
Я пока прелоад попробую все-таки.
На, код тупейший, знаю, зато понятный шаблон, просто при новом персонаже имя меняешь и все.
Функция реагирует на выделение героя с нужным саундсетом (и только его).
2.5 это сейчас там таймер стоит, а вообще там число меняется от 0.7 до 3, пока мне не покажется, что так меньше лагает
function SingerOfDeathSounds2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local trigger sounds = LoadTriggerHandle(udg_Hash,GetHandleId(t),10)
call EnableTrigger(sounds)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
set sounds = null
set t = null
endfunction
function SingerOfDeathSounds takes nothing returns nothing
local timer t = CreateTimer()
local trigger sounds = GetTriggeringTrigger()
//Много звуков - лучше так - ПЯТИДЕСЯТИБЛОКАМИ И ДАЖЕ ЧЕРЕЗ ГЛОБАЛКУ В РЕДКОМ СЛУЧАЕ
if ( GetPlayerController(GetOwningPlayer(GetTriggerUnit())) == MAP_CONTROL_USER ) then
set udg_integer = GetRandomInt (1, 175)
//ОТКРЫТО
if (udg_integer == 1) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath1, 100, GetTriggerUnit() )
else
if (udg_integer == 2) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath2, 100, GetTriggerUnit() )
else
if (udg_integer == 3) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath3, 100, GetTriggerUnit() )
else
if (udg_integer == 4) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath4, 100, GetTriggerUnit() )
else
if (udg_integer == 5) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath5, 100, GetTriggerUnit() )
else
if (udg_integer == 6) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath6, 100, GetTriggerUnit() )
else
if (udg_integer == 7) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath7, 100, GetTriggerUnit() )
else
if (udg_integer == 8) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath8, 100, GetTriggerUnit() )
else
if (udg_integer == 9) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath9, 100, GetTriggerUnit() )
else
if (udg_integer == 10) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath10, 100, GetTriggerUnit() )
else
if (udg_integer == 11) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath11, 100, GetTriggerUnit() )
else
if (udg_integer == 12) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath12, 100, GetTriggerUnit() )
else
if (udg_integer == 13) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath13, 100, GetTriggerUnit() )
else
if (udg_integer == 14) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath14, 100, GetTriggerUnit() )
else
if (udg_integer == 15) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath15, 100, GetTriggerUnit() )
else
if (udg_integer == 16) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath16, 100, GetTriggerUnit() )
else
if (udg_integer == 17) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath17, 100, GetTriggerUnit() )
else
if (udg_integer == 18) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath18, 100, GetTriggerUnit() )
else
if (udg_integer == 19) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath19, 100, GetTriggerUnit() )
else
if (udg_integer == 20) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath20, 100, GetTriggerUnit() )
else
if (udg_integer == 21) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath21, 100, GetTriggerUnit() )
else
if (udg_integer == 22) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath22, 100, GetTriggerUnit() )
else
if (udg_integer == 23) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath23, 100, GetTriggerUnit() )
else
if (udg_integer == 24) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath24, 100, GetTriggerUnit() )
else
if (udg_integer == 25) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath25, 100, GetTriggerUnit() )
else
if (udg_integer == 26) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath26, 100, GetTriggerUnit() )
else
if (udg_integer == 27) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath27, 100, GetTriggerUnit() )
else
if (udg_integer == 28) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath28, 100, GetTriggerUnit() )
else
if (udg_integer == 29) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath29, 100, GetTriggerUnit() )
else
if (udg_integer == 30) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath30, 100, GetTriggerUnit() )
else
if (udg_integer == 31) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath31, 100, GetTriggerUnit() )
else
if (udg_integer == 32) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath32, 100, GetTriggerUnit() )
else
if (udg_integer == 33) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath33, 100, GetTriggerUnit() )
else
if (udg_integer == 34) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath34, 100, GetTriggerUnit() )
else
if (udg_integer == 35) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath35, 100, GetTriggerUnit() )
else
if (udg_integer == 36) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath36, 100, GetTriggerUnit() )
else
if (udg_integer == 37) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath37, 100, GetTriggerUnit() )
else
if (udg_integer == 38) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath38, 100, GetTriggerUnit() )
else
if (udg_integer == 39) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath39, 100, GetTriggerUnit() )
else
if (udg_integer == 40) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath40, 100, GetTriggerUnit() )
else
if (udg_integer == 41) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath41, 100, GetTriggerUnit() )
else
if (udg_integer == 42) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath42, 100, GetTriggerUnit() )
else
if (udg_integer == 43) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath43, 100, GetTriggerUnit() )
else
if (udg_integer == 44) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath44, 100, GetTriggerUnit() )
else
if (udg_integer == 45) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath45, 100, GetTriggerUnit() )
else
if (udg_integer == 46) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath46, 100, GetTriggerUnit() )
else
if (udg_integer == 47) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath47, 100, GetTriggerUnit() )
else
if (udg_integer == 48) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath48, 100, GetTriggerUnit() )
else
if (udg_integer == 49) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath49, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
if (udg_integer == 50) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath50, 100, GetTriggerUnit() )
else
endif
//ЗАКРЫТО
//ОТКРЫТО
if (udg_integer == 51) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath51, 100, GetTriggerUnit() )
else
if (udg_integer == 52) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath52, 100, GetTriggerUnit() )
else
if (udg_integer == 53) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath53, 100, GetTriggerUnit() )
else
if (udg_integer == 54) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath54, 100, GetTriggerUnit() )
else
if (udg_integer == 55) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath55, 100, GetTriggerUnit() )
else
if (udg_integer == 56) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath56, 100, GetTriggerUnit() )
else
if (udg_integer == 57) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath57, 100, GetTriggerUnit() )
else
if (udg_integer == 58) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath58, 100, GetTriggerUnit() )
else
if (udg_integer == 59) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath59, 100, GetTriggerUnit() )
else
if (udg_integer == 60) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath60, 100, GetTriggerUnit() )
else
if (udg_integer == 61) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath61, 100, GetTriggerUnit() )
else
if (udg_integer == 62) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath62, 100, GetTriggerUnit() )
else
if (udg_integer == 63) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath63, 100, GetTriggerUnit() )
else
if (udg_integer == 64) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath64, 100, GetTriggerUnit() )
else
if (udg_integer == 65) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath65, 100, GetTriggerUnit() )
else
if (udg_integer == 66) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath66, 100, GetTriggerUnit() )
else
if (udg_integer == 67) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath67, 100, GetTriggerUnit() )
else
if (udg_integer == 68) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath68, 100, GetTriggerUnit() )
else
if (udg_integer == 69) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath69, 100, GetTriggerUnit() )
else
if (udg_integer == 70) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath70, 100, GetTriggerUnit() )
else
if (udg_integer == 71) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath71, 100, GetTriggerUnit() )
else
if (udg_integer == 72) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath72, 100, GetTriggerUnit() )
else
if (udg_integer == 73) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath73, 100, GetTriggerUnit() )
else
if (udg_integer == 74) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath74, 100, GetTriggerUnit() )
else
if (udg_integer == 75) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath75, 100, GetTriggerUnit() )
else
if (udg_integer == 76) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath76, 100, GetTriggerUnit() )
else
if (udg_integer == 77) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath77, 100, GetTriggerUnit() )
else
if (udg_integer == 78) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath78, 100, GetTriggerUnit() )
else
if (udg_integer == 79) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath79, 100, GetTriggerUnit() )
else
if (udg_integer == 80) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath80, 100, GetTriggerUnit() )
else
if (udg_integer == 81) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath81, 100, GetTriggerUnit() )
else
if (udg_integer == 82) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath82, 100, GetTriggerUnit() )
else
if (udg_integer == 83) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath83, 100, GetTriggerUnit() )
else
if (udg_integer == 84) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath84, 100, GetTriggerUnit() )
else
if (udg_integer == 85) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath85, 100, GetTriggerUnit() )
else
if (udg_integer == 86) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath86, 100, GetTriggerUnit() )
else
if (udg_integer == 87) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath87, 100, GetTriggerUnit() )
else
if (udg_integer == 88) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath88, 100, GetTriggerUnit() )
else
if (udg_integer == 89) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath89, 100, GetTriggerUnit() )
else
if (udg_integer == 90) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath90, 100, GetTriggerUnit() )
else
if (udg_integer == 91) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath91, 100, GetTriggerUnit() )
else
if (udg_integer == 92) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath92, 100, GetTriggerUnit() )
else
if (udg_integer == 93) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath93, 100, GetTriggerUnit() )
else
if (udg_integer == 94) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath94, 100, GetTriggerUnit() )
else
if (udg_integer == 95) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath95, 100, GetTriggerUnit() )
else
if (udg_integer == 96) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath96, 100, GetTriggerUnit() )
else
if (udg_integer == 97) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath97, 100, GetTriggerUnit() )
else
if (udg_integer == 98) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath98, 100, GetTriggerUnit() )
else
if (udg_integer == 99) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath99, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
if (udg_integer == 100) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath100, 100, GetTriggerUnit() )
else
endif
//ЗАКРЫТО
//ОТКРЫТО
if (udg_integer == 101) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath101, 100, GetTriggerUnit() )
else
if (udg_integer == 102) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath102, 100, GetTriggerUnit() )
else
if (udg_integer == 103) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath103, 100, GetTriggerUnit() )
else
if (udg_integer == 104) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath104, 100, GetTriggerUnit() )
else
if (udg_integer == 105) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath105, 100, GetTriggerUnit() )
else
if (udg_integer == 106) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath106, 100, GetTriggerUnit() )
else
if (udg_integer == 107) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath107, 100, GetTriggerUnit() )
else
if (udg_integer == 108) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath108, 100, GetTriggerUnit() )
else
if (udg_integer == 109) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath109, 100, GetTriggerUnit() )
else
if (udg_integer == 110) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath110, 100, GetTriggerUnit() )
else
if (udg_integer == 111) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath111, 100, GetTriggerUnit() )
else
if (udg_integer == 112) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath112, 100, GetTriggerUnit() )
else
if (udg_integer == 113) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath113, 100, GetTriggerUnit() )
else
if (udg_integer == 114) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath114, 100, GetTriggerUnit() )
else
if (udg_integer == 115) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath115, 100, GetTriggerUnit() )
else
if (udg_integer == 116) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath116, 100, GetTriggerUnit() )
else
if (udg_integer == 117) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath117, 100, GetTriggerUnit() )
else
if (udg_integer == 118) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath118, 100, GetTriggerUnit() )
else
if (udg_integer == 119) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath119, 100, GetTriggerUnit() )
else
if (udg_integer == 120) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath120, 100, GetTriggerUnit() )
else
if (udg_integer == 121) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath121, 100, GetTriggerUnit() )
else
if (udg_integer == 122) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath122, 100, GetTriggerUnit() )
else
if (udg_integer == 123) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath123, 100, GetTriggerUnit() )
else
if (udg_integer == 124) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath124, 100, GetTriggerUnit() )
else
if (udg_integer == 125) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath125, 100, GetTriggerUnit() )
else
if (udg_integer == 126) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath126, 100, GetTriggerUnit() )
else
if (udg_integer == 127) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath127, 100, GetTriggerUnit() )
else
if (udg_integer == 128) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath128, 100, GetTriggerUnit() )
else
if (udg_integer == 129) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath129, 100, GetTriggerUnit() )
else
if (udg_integer == 130) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath130, 100, GetTriggerUnit() )
else
if (udg_integer == 131) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath131, 100, GetTriggerUnit() )
else
if (udg_integer == 132) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath132, 100, GetTriggerUnit() )
else
if (udg_integer == 133) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath133, 100, GetTriggerUnit() )
else
if (udg_integer == 134) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath134, 100, GetTriggerUnit() )
else
if (udg_integer == 135) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath135, 100, GetTriggerUnit() )
else
if (udg_integer == 136) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath136, 100, GetTriggerUnit() )
else
if (udg_integer == 137) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath137, 100, GetTriggerUnit() )
else
if (udg_integer == 138) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath138, 100, GetTriggerUnit() )
else
if (udg_integer == 139) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath139, 100, GetTriggerUnit() )
else
if (udg_integer == 140) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath140, 100, GetTriggerUnit() )
else
if (udg_integer == 141) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath141, 100, GetTriggerUnit() )
else
if (udg_integer == 142) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath142, 100, GetTriggerUnit() )
else
if (udg_integer == 143) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath143, 100, GetTriggerUnit() )
else
if (udg_integer == 144) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath144, 100, GetTriggerUnit() )
else
if (udg_integer == 145) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath145, 100, GetTriggerUnit() )
else
if (udg_integer == 146) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath146, 100, GetTriggerUnit() )
else
if (udg_integer == 147) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath147, 100, GetTriggerUnit() )
else
if (udg_integer == 148) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath148, 100, GetTriggerUnit() )
else
if (udg_integer == 149) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath149, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
if (udg_integer == 150) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath150, 100, GetTriggerUnit() )
else
endif
//ЗАКРЫТО
//ОТКРЫТО
if (udg_integer == 151) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath151, 100, GetTriggerUnit() )
else
if (udg_integer == 152) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath152, 100, GetTriggerUnit() )
else
if (udg_integer == 153) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath153, 100, GetTriggerUnit() )
else
if (udg_integer == 154) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath154, 100, GetTriggerUnit() )
else
if (udg_integer == 155) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath155, 100, GetTriggerUnit() )
else
if (udg_integer == 156) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath156, 100, GetTriggerUnit() )
else
if (udg_integer == 157) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath157, 100, GetTriggerUnit() )
else
if (udg_integer == 158) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath158, 100, GetTriggerUnit() )
else
if (udg_integer == 159) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath159, 100, GetTriggerUnit() )
else
if (udg_integer == 160) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath160, 100, GetTriggerUnit() )
else
if (udg_integer == 161) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath161, 100, GetTriggerUnit() )
else
if (udg_integer == 162) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath162, 100, GetTriggerUnit() )
else
if (udg_integer == 163) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath163, 100, GetTriggerUnit() )
else
if (udg_integer == 164) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath164, 100, GetTriggerUnit() )
else
if (udg_integer == 165) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath165, 100, GetTriggerUnit() )
else
if (udg_integer == 166) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath166, 100, GetTriggerUnit() )
else
if (udg_integer == 167) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath167, 100, GetTriggerUnit() )
else
if (udg_integer == 168) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath168, 100, GetTriggerUnit() )
else
if (udg_integer == 169) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath169, 100, GetTriggerUnit() )
else
if (udg_integer == 170) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath170, 100, GetTriggerUnit() )
else
if (udg_integer == 171) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath171, 100, GetTriggerUnit() )
else
if (udg_integer == 172) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath172, 100, GetTriggerUnit() )
else
if (udg_integer == 173) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath173, 100, GetTriggerUnit() )
else
if (udg_integer == 174) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath174, 100, GetTriggerUnit() )
else
if (udg_integer == 175) then
call PlaySoundOnUnitBJ( gg_snd_SingerOfDeath175, 100, GetTriggerUnit() )
else
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
//ЗАКРЫТО
//ЗАКРЫТО
endif
call DisableTrigger(GetTriggeringTrigger())
call SaveTriggerHandle(udg_Hash, GetHandleId(t),10,sounds)
call TimerStart (t, 2.5, false, function SingerOfDeathSounds2)
//Много звуков - лучше так - закрыто.
set sounds = null
set t = null
endfunction
Но не прелоадить же каждый из сотен (если не тысяч потом) звуков подобным образом, это же бред, да и тема столетняя
Короче, если не получаю ясности, для начала пока попробую проиграть звуки с громкостью 0 при инициализации и посмотрю, что получится
quq_CCCP, то есть уточни, плз: их проиграть при инициализации карты с громкостью 0? Или что конкретно сделать? Хочется увидеть образец прелоада на 1 любой звук.
Че еще подумалось... может, есть смысл кастомные звуки "прелоадить" - при инициализации карты массово проигрывать с громкостью 0? Или бред и ни на что не повлияет?
Сколько там приставке NES исполнилось, до сих пор игры делают. И иногда даже что-то отчасти коммерческое. Главное, чтобы был профит, как минимум кайф, все остальное не важно.
Clamp, неплохо, подумаю
хотя если для конкретно этого спелла, проще что-то с одним крокодилом замутить, в других случаях пока проблем не замечалось, но все равно стоит иметь в виду такое глобальное решение (как минимум для героев)
ладно, пока, думаю, достаточно, как обновлю код, если еще понадобится - отпишу
Clamp, ага, всё понятно, то есть Alive и Dead проверки действительно лишние.
Пока получается так - может существовать фактически мёртвый юнит с количеством жизней, которое игра считает большим 0, и даже большим 1. Иначе не могу объяснить фатал.
Может, у меня там какой-то триггерный хил действует без проверки на мертвяков, хилит мертвяка и... gg.
Хотя вообще большинство функций у меня исключает мертвяков при проверке групп из обрабатываемых единиц, но... могло быть где-то пренебрежение для хила - типа он же мёртвый, какая разница, отхилится или нет, пока не реснется, не важно, а после реса все равно фулл хп будет. Ну вот разница и вылезла. Придётся эти пренебрежения искать.
И поставлю таки наверное вместо 1 конкретно в этой функции хотя бы 25, что ли, это будет не заметно в 99.5% случаев, а фаталы если и не устранит вообще, то сделает их еще меньше (их и ща мало, крокодилом было много норм игр сыграно, ему больше месяца уже и была вот дрочка с 6 ботами-крокодилами, но вот 2 раза таки вылезли).
Clamp, "Сначала все возможные проверки, потом все зависящие от них действия, не наоборот" - а у меня как?
Про функцию - справедливо, ну много чего можно посжимать в функции, да, но это дофига перелопачивать, хотя себя оправдает, ну это ок, но немного другой вопрос.
Clamp, вот с одной точно жопа будет, потому что уже есть опыт, IsUnitAlive и IsUnitDead точно косые какие-то.
Потому что у меня есть другой герой, Гидралиск, который вселяется в крипа, хайдится и типа входит внутрь него до смерти крипа (можно эту смерть вручную сделать через добавляемую крипу абилку, типа разорвать его изнутри и вылезти).
Там стояла одна проверка.
Так вот в большинстве случаев все было ок, но бывало, что, когда крип умирал, Гидралиск не анхайдился до его разложения (а это полная жопа).
Вот ща там проверка типа такой тройной по-моему и вроде тьфу-тьфу все норм.
Проверка именно поэтому такая хардкорная стоит и здесь, и вот даже её оказалось недостаточно.
Короче, не знаю, в крайнем случае поменяю единицу на цифру чуть побольше (правда, чем больше будет цифра - тем больше уже будет фактическая погрешность в действии способности, но вплоть до 100 хп это будет не сильно страшно), тут трудности в том, что фатал действительно очень редко, так что сложно будет понять, исправлен он окончательно или нет. /
БД на броню в 2017 и во времена мемхака... как раз с GetUnitArmor от него отказ и произошёл, спасибо, если все через бд делать, так и варкрафт не очень нужен
Ну вот он код в первом сообщении, вот A28X абила... Какого панциря при проверке аж тремя функциями
if IsUnitAliveBJ(u5) == true and GetUnitState(u5,UNIT_STATE_LIFE)>1 and IsUnitDeadBJ(u5) == false
игра умудряется его в редком случае видеть НЕ мёртвым?!
Она тут его живого-то с 1 хп за мёртвого должна считать, а получается, что и мёртвого всё-таки иногда (хотя и КРАЙНЕ редко) живым видит.
quq_CCCP, в обеих катках с фаталом был крокодил, так что 90%, что из-за крокодила
а у крокодила это самая подозрительная абила
но это что-то очень-очень редкое, в каком бы коде ни было, потому что когда был словлен первый фатал с крокодилом, мной было поставлено 6 ботов-крокодилов и они 5 минут рубились без фатала, и вообще минимум 80% каток с крокодилами проходило без фатала, а точнее, все, кроме двух, вторая только что была
проверок до фига поставлено именно от греха подальше на всякий случай
замечания учту
Вот вся функция целиком на вторую абилу, в которой сильнее всего сомневаюсь:
смотреть сюда
function SkinForFriendsRefresh takes nothing returns nothing ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local real number = GetUnitArmor(u5) ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЕСЛИ БРОНЯ БОЛЬШЕ ДОПУСТИМОГО ЛВЛА - СНИЗИТЬ НОМЕР
if number > GetUnitAbilityLevelSwapped('A28T',u5) * 22 then
set number = GetUnitAbilityLevelSwapped('A28T',u5) * 22
endif
if number > 99 then
set number = 99
endif ЕСЛИ БРОНЯ БОЛЬШЕ ДОПУСТИМОГО ЛВЛА - СНИЗИТЬ НОМЕР - ЗАКРЫТО.
ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ, ЗАДАНИЕ НУЖНОГО УРОВНЯ СПОСОБНОСТИ, ТОЛЬКО ЕСЛИ ЖИВ!!!
if IsUnitAliveBJ(u5) == true and GetUnitState(u5,UNIT_STATE_LIFE)>1 and IsUnitDeadBJ(u5) == false then
call UnitAddAbility(u5,'A28W')
call SetPlayerAbilityAvailableBJ( false, 'A28W', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A28W')
call UnitMakeAbilityPermanent(u5,true,'A28X')
call SetUnitAbilityLevelSwapped('A28X',u5,R2I(number))
endif ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Может, ещё гетюнитармор не надо в начале считать при объявлении переменных? Она не мемхачная, а старая с хайва и там селфдамаг... может, там если юнита вдруг оказалось, что нет, получается ноль и из-за этого трындец где-то дальше... попробую мб заменить на мемхачную
Я просто пока размышляю
Я по логу хочу причину фатала услышать
У меня два основных предположения - если от вылета из-за повышения уровня абилы у мёртвой боевой единицы, то это точно эта абила (вторая). Если от записи чего-то в память, то это третья.
Третья вот, если кому не лениво ещё и её смотреть:
смотреть сюда
function BlessingOfTheNileAttack takes nothing returns nothing ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = CreateTimer()
local unit u5 = GetAttacker()
local unit u6 = GetAttackedUnitBJ()
local integer level = R2I(GetUnitAbilityLevelSwapped('A28U',u5))
local integer i = 0 ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if (u5 !=null) then
if ( GetUnitAbilityLevelSwapped('A28U', u5) > 0 ) and ( GetUnitAbilityLevelSwapped('A290', u5) > 0 ) then
Удаление маркера с атаковавшего
call UnitRemoveAbility(u5,'A290') Удаление маркера с атаковавшего - закрыто.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t = null
set u5 = null
set u6 = null ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function BlessingOfTheNileRefresh takes nothing returns nothing ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, heroadded, heroaction, enemies
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6
local location p = GetUnitLoc(u5)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local group enemies=CreateGroup() ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = LoadInteger(udg_Hash,GetHandleId(t),3)
set i = i+1
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
else
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
set heroadded=CreateTrigger()
set heroaction = TriggerAddAction(heroadded,function BlessingOfTheNileAttack)
set enemies = GetUnitsInRangeOfLocAll(800.00, p)
loop
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitEnemy(u6,GetOwningPlayer(u5))==true ) then
call TriggerRegisterUnitEvent(heroadded, u6, EVENT_UNIT_ATTACKED)
else
endif
endloop
call DestroyGroup (enemies)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, heroadded, heroaction, enemies
set t = null
set u5 = null
set u6 = null
set p = null
set heroadded = null
set heroaction = null
set enemies = null ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Кушка простейшая, там фатала в принципе не должно быть, сейчас была перепроверена - ничего подозрительного не вижу...
ну вот у него проверка перед заданием лвла дамми девотион ауры в спеллбуке
я грешу, что фатал может вылететь от повышения лвла абилы у мёртвой боевой единицы
if (u5 == null) then
call PauseTimer (t)
call DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
else
//ЕСЛИ БРОНЯ БОЛЬШЕ ДОПУСТИМОГО ЛВЛА - СНИЗИТЬ НОМЕР
if number > GetUnitAbilityLevelSwapped('A28T',u5) * 22 then
set number = GetUnitAbilityLevelSwapped('A28T',u5) * 22
endif
if number > 99 then
set number = 99
endif
//ЕСЛИ БРОНЯ БОЛЬШЕ ДОПУСТИМОГО ЛВЛА - СНИЗИТЬ НОМЕР - ЗАКРЫТО.
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ, ЗАДАНИЕ НУЖНОГО УРОВНЯ СПОСОБНОСТИ, ТОЛЬКО ЕСЛИ ЖИВ!!!
if IsUnitAliveBJ(u5) == true and GetUnitState(u5,UNIT_STATE_LIFE)>1 and IsUnitDeadBJ(u5) == false then
call UnitAddAbility(u5,'A28W')
call SetPlayerAbilityAvailableBJ( false, 'A28W', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A28W')
call UnitMakeAbilityPermanent(u5,true,'A28X')
call SetUnitAbilityLevelSwapped('A28X',u5,R2I(number))
endif
//ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
endif
По-моему, проверка даже излишне осторожная немножко, т. к. если он будет живой с хп 1, то не получит ауры брони и повышения ее уровня (но вероятность этого < 0.1% по очевидной причине, а вероятность того, что он через секунду либо не умрёт, либо не отрегает хп, < 0.001%).
Тогда какого панциря фатал? Это не ульта, ни в той ни в другой катке крокодил до 8 уровня не докачивался. Остаются кушка - но это тупо АоЕ дамаг с накидыванием и сразу убиранием абилы ауры дамага... и... ешка, ну там увеличивается броня на сотые доли через мемхак, но без умножения, просто через мемхак плюсуются сотые доли брони, неужели что-то в ешке?
^^^^
Короче, выше это все лирика, просто интересно по логу причины фатала узнать.
Вот эту модель бы сделать буквально больше. Раза так в полтора.
Простое увеличение в РО для юнита не подходит, т. к. у героя пассивка, завязанная на его росте и изменяющая его, а эта модель является аватаром героя и должна подстраиваться под остальные его инкарнации, а не наоборот. Можно для аватара прописать ифзенэлс, конечно, но это бОльший изврат, чем просто изменить размер модели.
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
» WarCraft 3 / Battle for Souls 3.2b
Номер не изменён, просто фиксы редкого фатала Собека (вероятный) и типа оптимизации Картуса
» WarCraft 3 / Пустые строки
Комменты тоже есть.
Меня главное, что интересует, не будет ли считаться, что кода типа "больше" (мб там еще больше функций придётся прелоадить) или таки пробелы заигнорятся?
Ред. ClotPh
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
Это вообще само по себе "особое" решение, знаю, должны нормально быть кастомные саундсеты =/
Если кому не влом, киньте, плз, тут линки еще раз на то, как свои саундсеты делать, у меня будет уже по ссылкам прямо перебираться с блога сюда, а тут по линкам туда и постепенно мб раскурю.
//////////
/////////
Когда-нить мб пригодится
В общем, дело такое: поставлено проигрывать все звуки Картуса в начале одного триггера (на старте буквально сразу). В этот момент ощущается четкий сильный лаг, а потом пока лагов замечено не было.
Так что да, ятп, суть в необходимости прелоада.
Офк один "типа лаг" вначале в тысячу раз лучше небольших лагов в процессе геймплея. Но проблема в том, что если дальше делать так, то он будет только расти и расти. Можно ли прелоадить без лага? Ну не нахожу ничего, кроме вот той ссылки, и там вроде не то. Или только дораскуривать создание своих саундсетов через потрошение варкрафта?
» WarCraft 3 / Способности и алгоритмы на заказ
Sen-smit, ну скорость перемещения можно в процентах триггерно, а скорость боя на основе предмета-перчатки менять, это просто наводка
////
А тебе точно надо именно в процентах и именно без баффа? Все-таки аура выносливости только на себя - действительно очень удобный вариант, только единственное, что с баффом. Чем бафф так мешает?
» WarCraft 3 / Mixtape файл для 1.27b
Ред. ClotPh
» WarCraft 3 / Создание собственного звукового сета для героя
Ред. Кет
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
Я пока прелоад попробую все-таки.
На, код тупейший, знаю, зато понятный шаблон, просто при новом персонаже имя меняешь и все.
Функция реагирует на выделение героя с нужным саундсетом (и только его).
2.5 это сейчас там таймер стоит, а вообще там число меняется от 0.7 до 3, пока мне не покажется, что так меньше лагает
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
Короче, если не получаю ясности, для начала пока попробую проиграть звуки с громкостью 0 при инициализации и посмотрю, что получится
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
» WarCraft 3 / Кастомные звуки, много ифзенэлсов мб = лаг
» WarCraft 3 / 15...
» WarCraft 3 / Прошу просто назвать причины фатала
» WarCraft 3 / Прошу просто назвать причины фатала
хотя если для конкретно этого спелла, проще что-то с одним крокодилом замутить, в других случаях пока проблем не замечалось, но все равно стоит иметь в виду такое глобальное решение (как минимум для героев)
ладно, пока, думаю, достаточно, как обновлю код, если еще понадобится - отпишу
» WarCraft 3 / Прошу просто назвать причины фатала
И поставлю таки наверное вместо 1 конкретно в этой функции хотя бы 25, что ли, это будет не заметно в 99.5% случаев, а фаталы если и не устранит вообще, то сделает их еще меньше (их и ща мало, крокодилом было много норм игр сыграно, ему больше месяца уже и была вот дрочка с 6 ботами-крокодилами, но вот 2 раза таки вылезли).
» WarCraft 3 / Прошу просто назвать причины фатала
Про функцию - справедливо, ну много чего можно посжимать в функции, да, но это дофига перелопачивать, хотя себя оправдает, ну это ок, но немного другой вопрос.
» WarCraft 3 / Прошу просто назвать причины фатала
Потому что у меня есть другой герой, Гидралиск, который вселяется в крипа, хайдится и типа входит внутрь него до смерти крипа (можно эту смерть вручную сделать через добавляемую крипу абилку, типа разорвать его изнутри и вылезти).
Там стояла одна проверка.
Так вот в большинстве случаев все было ок, но бывало, что, когда крип умирал, Гидралиск не анхайдился до его разложения (а это полная жопа).
Вот ща там проверка типа такой тройной по-моему и вроде тьфу-тьфу все норм.
/
» WarCraft 3 / Прошу просто назвать причины фатала
игра умудряется его в редком случае видеть НЕ мёртвым?!
» WarCraft 3 / Прошу просто назвать причины фатала
а у крокодила это самая подозрительная абила
но это что-то очень-очень редкое, в каком бы коде ни было, потому что когда был словлен первый фатал с крокодилом, мной было поставлено 6 ботов-крокодилов и они 5 минут рубились без фатала, и вообще минимум 80% каток с крокодилами проходило без фатала, а точнее, все, кроме двух, вторая только что была
проверок до фига поставлено именно от греха подальше на всякий случай
замечания учту
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local real number = GetUnitArmor(u5)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
if number > GetUnitAbilityLevelSwapped('A28T',u5) * 22 then
set number = GetUnitAbilityLevelSwapped('A28T',u5) * 22
endif
if number > 99 then
set number = 99
endif
ЕСЛИ БРОНЯ БОЛЬШЕ ДОПУСТИМОГО ЛВЛА - СНИЗИТЬ НОМЕР - ЗАКРЫТО.
if IsUnitAliveBJ(u5) == true and GetUnitState(u5,UNIT_STATE_LIFE)>1 and IsUnitDeadBJ(u5) == false then
call UnitAddAbility(u5,'A28W')
call SetPlayerAbilityAvailableBJ( false, 'A28W', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A28W')
call UnitMakeAbilityPermanent(u5,true,'A28X')
call SetUnitAbilityLevelSwapped('A28X',u5,R2I(number))
endif
ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Я просто пока размышляю
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = CreateTimer()
local unit u5 = GetAttacker()
local unit u6 = GetAttackedUnitBJ()
local integer level = R2I(GetUnitAbilityLevelSwapped('A28U',u5))
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call UnitRemoveAbility(u5,'A290')
Удаление маркера с атаковавшего - закрыто.
call SetUnitBaseArmor(u5, GetUnitBaseArmor(u5) + 0.01 * I2R(level))
ДОБАВКА БРОНИ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call SaveInteger(udg_Hash,GetHandleId(t),4,level)
call TimerStart(t,0.25,true,function BlessingOfTheNileAttack2)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
set t = null
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, p, heroadded, heroaction, enemies
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6
local location p = GetUnitLoc(u5)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local group enemies=CreateGroup()
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = LoadInteger(udg_Hash,GetHandleId(t),3)
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
if (u5 == null) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
else
call DestroyTrigger(heroadded)
set heroadded=CreateTrigger()
set heroaction = TriggerAddAction(heroadded,function BlessingOfTheNileAttack)
loop
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitEnemy(u6,GetOwningPlayer(u5))==true ) then
call TriggerRegisterUnitEvent(heroadded, u6, EVENT_UNIT_ATTACKED)
else
endif
endloop
call DestroyGroup (enemies)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),21,heroaction)
endif
call RemoveLocation (p)
set t = null
set u5 = null
set u6 = null
set p = null
set heroadded = null
set heroaction = null
set enemies = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
» WarCraft 3 / Прошу просто назвать причины фатала
я грешу, что фатал может вылететь от повышения лвла абилы у мёртвой боевой единицы
Тогда какого панциря фатал? Это не ульта, ни в той ни в другой катке крокодил до 8 уровня не докачивался. Остаются кушка - но это тупо АоЕ дамаг с накидыванием и сразу убиранием абилы ауры дамага... и... ешка, ну там увеличивается броня на сотые доли через мемхак, но без умножения, просто через мемхак плюсуются сотые доли брони, неужели что-то в ешке?
Короче, выше это все лирика, просто интересно по логу причины фатала узнать.
» WarCraft 3 / Фразы юнитов при нажатии
» WarCraft 3 / Нужна модель? - Вам сюда!
Простое увеличение в РО для юнита не подходит, т. к. у героя пассивка, завязанная на его росте и изменяющая его, а эта модель является аватаром героя и должна подстраиваться под остальные его инкарнации, а не наоборот. Можно для аватара прописать ифзенэлс, конечно, но это бОльший изврат, чем просто изменить размер модели.
» WarCraft 3 / Разная магия pt.3
» WarCraft 3 / Перезарядить отдельный предмет
» WarCraft 3 / Перезарядить отдельный предмет