Фатал после выхода из игры на новом герое.
После, т. е. доигрывается нормально, реплей сохраняется нормально, не смертельно, но лучше бы исправить.
Герой своими способностями увеличивает атаку крипам, массово.
Но у всех точно уже есть атака, иначе сразу бы фаталило.
Архив из папки Errors приложен.
Это точно из-за атаки? И если да, то почему?
Функция на атаку пока "старая" еще, на новую поменяю позже.

Принятый ответ

падает при чистке памяти, строки нигде не перезаписываешь из мемхака? Это точно не с цифрами работа
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
16
6 лет назад
2
падает при чистке памяти, строки нигде не перезаписываешь из мемхака? Это точно не с цифрами работа
Принятый ответ
0
21
6 лет назад
0
DracoL1ch, уточни, не понимаю
строки - это что? перезаписать мемхаком строковой параметр в РО, что ли?
Используется StringHash, но вроде без связи с мемхаком...
Крч, вот коды последнего героя
Это точно он, после игры с ним в англ карту был фатал после выхода из игры и после игры в русскую карту то же самое, всегда с ним фатал походу
code
function PriestOfTitaniaCrystals takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t2, u5, u6, u7, p, p2, elfs, crystals, heroes
local timer t2 = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t2),2)
local unit u6
local unit u7
local location p
local location p2
local group elfs = GetUnitsInRectAll(GetPlayableMapRect())
local group crystals = GetUnitsInRectAll(GetPlayableMapRect())
local group heroes = GetUnitsInRectAll(GetPlayableMapRect())
local integer i = LoadInteger(udg_Hash, GetHandleId(t2),3)
local integer count = 0
local integer count2 = 0
local real elf_creaturetype = 0
local real crystal_might = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
set i = i+1
call SaveInteger(udg_Hash,GetHandleId(t2),3,i)
if IsDead(u5) == true or u5 == null then
call PauseTimer(t2)
call DestroyTimer(t2)
call FlushChildHashtable(udg_Hash, GetHandleId(t2))
else
ГЕРОИ БЕРУТ КРИСТАЛЛЫ...
loop
set u6=FirstOfGroup(heroes)
exitwhen u6==null
call GroupRemoveUnit(heroes,u6)
if ( IsUnitType((u6), UNIT_TYPE_HERO) == true ) and IsDead (u6) == false then
set p = GetUnitLoc(u6)
set count2 = CountUnitsInGroup(crystals)
set count = 0
ТУТ ПОД ПЕРВЫМ УСЛОВИЕМ УЖЕ ЦИКЛ ДЛЯ КРИСТАЛЛОВ, СВЕРХУ НАМ НУЖНО ТОЛЬКО U6 И P...
loop
set u7=FirstOfGroup(crystals)
exitwhen u7==null
call GroupRemoveUnit(crystals,u7)
if ( GetUnitTypeId(u7) == 'n416' ) and IsDead(u7) == false then
set p2 = GetUnitLoc(u7)
if DistanceBetweenPoints (p, p2) < 120 then
set crystal_might = LoadReal(udg_Hash,GetHandleId(u7),StringHash("crystal_might"))
loop
exitwhen crystal_might == 0
set crystal_might = crystal_might - 1
ЭФФЕКТ И ДОБАВКА МАКС. МАНЫ ТРИЖДЫ - ЗАКРЫТО.
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Polymorph\\PolyMorphTarget.mdl.mdx", u6, "chest"))
call UnitAddAbilityBJ('A25P', u6)
call SetUnitAbilityLevelSwapped('A25P', u6, 2)
call UnitRemoveAbilityBJ('A25P', u6)
call UnitAddAbilityBJ('A25P', u6)
call SetUnitAbilityLevelSwapped('A25P', u6, 2)
call UnitRemoveAbilityBJ('A25P', u6)
call UnitAddAbilityBJ('A25P', u6)
call SetUnitAbilityLevelSwapped('A25P', u6, 2)
call UnitRemoveAbilityBJ('A25P', u6)
ЭФФЕКТ И ДОБАВКА МАКС. МАНЫ ТРИЖДЫ - ЗАКРЫТО.
endloop
call RemoveUnit(u7)
call RemoveLocation(p2)
endif
else
endif
endloop
ТУТ ПJД ПЕРВЫМ УСЛОВИЕМ УЖЕ ЦИКЛ ДЛЯ КРИСТАЛЛОВ - ЗАКРЫТО.
ГРУППА КРИСТАЛЛОВ ПОЛНОСТЬЮ ОЧИЩЕНА, НУЖНО ДОБАВИТЬ В НЕЕ ВСЕХ
call GroupAddGroup( elfs, crystals )
ГРУППА КРИСТАЛЛОВ ПОЛНОСТЬЮ ОЧИЩЕНА, НУЖНО ДОБАВИТЬ В НЕЕ ВСЕХ
call RemoveLocation(p)
else
endif
endloop
ГЕРОИ БЕРУТ КРИСТАЛЛЫ - ЗАКРЫТО.
ЖРЕЦ СПАВНИТ КРИСТАЛЛ МОЩЬЮ ПО КОЛ-ВУ ЭЛЬФОВ - ПРОВЕРКА ПО ХЭШУ С ЗАПИСЬЮ В ПЕРЕМЕННУЮ! - СО ВРЕМЕНЕМ ЖИЗНИ 4 СЕК КАЖДЫЙ (РАЗ В 5 СЕКУНД)
if i >=5 then
set i = 0
call SaveInteger(udg_Hash,GetHandleId(t2),3,i)
loop
set u6=FirstOfGroup(elfs)
exitwhen u6==null
set elf_creaturetype = LoadReal(udg_Hash,GetHandleId(u6),StringHash("elf_creaturetype"))
call GroupRemoveUnit(elfs,u6)
if elf_creaturetype == 1 and IsDead (u6) == false then
set count = count + 1
else
endif
endloop
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Polymorph\\PolyMorphTarget.mdl.mdx",u5,"chest"))
set u6=CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), 'n416', GetUnitX(u5), GetUnitY(u5), bj_RADTODEG * Atan2(GetUnitY(u5) - GetUnitY(u5), GetUnitX(u5) - GetUnitX(u5)))
call UnitApplyTimedLifeBJ( 4.00, 'BTLF', u6 )
set crystal_might = 0
loop
exitwhen count==0
set crystal_might = crystal_might + 1
set count = count-1
endloop
call SaveReal(udg_Hash,GetHandleId(u6),StringHash("crystal_might"),crystal_might)
endif
ЖРЕЦ СПАВНИТ КРИСТАЛЛ МОЩЬЮ ПО КОЛ-ВУ ЭЛЬФОВ СО ВРЕМЕНЕМ ЖИЗНИ 4 СЕК КАЖДЫЙ - ЗАКРЫТО.
endif
call DestroyGroup (elfs)
call DestroyGroup (crystals)
call DestroyGroup (heroes)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t2, u5, u6, u7, p, p2, elfs, crystals, heroes
set t2 = null
set u5 = null
set u6 = null
set u7 = null
set p = null
set p2 = null
set elfs = null
set crystals = null
set heroes = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function PriestOfTitania2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ТУТ СТОП, Т. К. ЭТО ПОСЛЕ АВТОКАСТА НА ОСНОВЕ ХИЛКИ СТАТУИ, НО И ТАЙМЕР ЧУТЬ ПОДОЛЬШЕ
call IssueImmediateOrderBJ( u5, "stop" )
ТУТ СТОП, Т. К. ЭТО ПОСЛЕ АВТОКАСТА НА ОСНОВЕ ХИЛКИ СТАТУИ - ЗАКРЫТО.
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("priestoftitania"),0)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function PriestOfTitania takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, t2, u5, u6
local timer t = CreateTimer()
local timer t2 = CreateTimer()
local unit u5=GetTriggerUnit()
local unit u6
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = 0
local real priestoftitania = 0
set priestoftitania = LoadReal(udg_Hash,GetHandleId(u5),StringHash("priestoftitania"))
if ( GetSpellAbilityId() == 'A33A' ) and priestoftitania == 0 then
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("priestoftitania"),1)
call PlaySoundOnUnitBJ( gg_snd_MaroSorcererPriestOfTitania, 100, u5 )
set u6=CreateUnit(GetOwningPlayer(u5), 'n413', GetUnitX(u5), GetUnitY(u5), bj_RADTODEG * Atan2(GetUnitY(u5) - GetUnitY(u5), GetUnitX(u5) - GetUnitX(u5)))
call UnitApplyTimedLifeBJ( 120.00, 'BTLF', u6 )
ХЭШ ЭЛЬФА
call SaveReal(udg_Hash,GetHandleId(u6),StringHash("elf_creaturetype"),1)
ХЭШ ЭЛЬФА - ЗАКРЫТО.
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer2.mdx",u6,"origin"))
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer2.mdx",u6,"chest"))
ХП РЕГ ВНОВЬ СОЗДАННОМУ ПО ЛВЛУ СКАСТОВАННОЙ АБИЛЫ
call AddUnitHPRegen (u6,10.00*GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
ХП РЕГ ВНОВЬ СОЗДАННОМУ ПО ЛВЛУ СКАСТОВАННОЙ АБИЛЫ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call TimerStart(t,0.19,false,function PriestOfTitania2)
call SaveUnitHandle(udg_Hash, GetHandleId(t2),2,u6)
call SaveInteger(udg_Hash, GetHandleId(t2),3,i)
call TimerStart(t2,1,true,function PriestOfTitaniaCrystals)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
call PauseTimer(t2)
call DestroyTimer(t2)
call FlushChildHashtable(udg_Hash, GetHandleId(t2))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, t2, u5, u6
set t = null
set t2 = null
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function ElvishFighters2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("elvishfighters"),0)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function ElvishFighters takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = CreateTimer()
local unit u5=GetTriggerUnit()
local unit u6
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = 0
local real elvishfighters = 0
set elvishfighters = LoadReal(udg_Hash,GetHandleId(u5),StringHash("elvishfighters"))
if elvishfighters == 0 then
if ( GetSpellAbilityId() == 'A33B' ) or ( GetSpellAbilityId() == 'A33E' ) then
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("elvishfighters"),1)
В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ АБИЛА, СОЗДАЕМ КРИПА
ДЕРЗКИЙ ЭЛЬФ
if ( GetSpellAbilityId() == 'A33E' ) then
call PlaySoundOnUnitBJ( gg_snd_MaroSorcererDefiantElf, 100, u5 )
set u6=CreateUnit(GetOwningPlayer(u5), 'n418', GetUnitX(u5), GetUnitY(u5), bj_RADTODEG * Atan2(GetUnitY(u5) - GetUnitY(u5), GetUnitX(u5) - GetUnitX(u5)))
ДОБАВКА СПЛЕША U6
call SetPlayerAbilityAvailableBJ( false, 'A33H', GetOwningPlayer(u6) )
call UnitAddAbilityBJ('A33H', u6)
call UnitMakeAbilityPermanent(u6, true, 'A33H')
call UnitMakeAbilityPermanent(u6, true, 'A33G')
ДОБАВКА СПЛЕША U6 - ЗАКРЫТО.
ДЕРЗКИЙ ЭЛЬФ - ЗАКРЫТО.
endif
ЭЛЬФИЙСКИЙ ВОИН
if ( GetSpellAbilityId() == 'A33B' ) then
call PlaySoundOnUnitBJ( gg_snd_MaroSorcererElvishWarrior, 100, u5 )
set u6=CreateUnit(GetOwningPlayer(u5), 'n417', GetUnitX(u5), GetUnitY(u5), bj_RADTODEG * Atan2(GetUnitY(u5) - GetUnitY(u5), GetUnitX(u5) - GetUnitX(u5)))
endif
ЭЛЬФИЙСКИЙ ВОИН - ЗАКРЫТО.
В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ АБИЛА, СОЗДАЕМ КРИПА - ЗАКРЫТО.
ХЭШ ЭЛЬФА
call SaveReal(udg_Hash,GetHandleId(u6),StringHash("elf_creaturetype"),1)
ХЭШ ЭЛЬФА - ЗАКРЫТО.
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer2.mdx",u6,"origin"))
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer2.mdx",u6,"chest"))
ХП РЕГ ВНОВЬ СОЗДАННОМУ ПО ЛВЛУ СКАСТОВАННОЙ АБИЛЫ
call AddUnitHPRegen (u6,10.00*GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
ХП РЕГ ВНОВЬ СОЗДАННОМУ ПО ЛВЛУ СКАСТОВАННОЙ АБИЛЫ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call TimerStart(t,0.15,false,function ElvishFighters2)
else
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
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t = null
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Overrun2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("overrun"),0)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Overrun takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, alliedcreeps
local timer t = CreateTimer()
local unit u5=GetTriggerUnit()
local unit u6
local group alliedcreeps = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = 0
local real overrun = 0
set overrun = LoadReal(udg_Hash,GetHandleId(u5),StringHash("overrun"))
if ( GetSpellAbilityId() == 'A33D' ) and overrun == 0 then
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("overrun"),1)
call PlaySoundOnUnitBJ( gg_snd_MaroSorcererOverrun, 100, u5 )
ВСЕ ДЕЙСТВИЯ С ГРУППОЙ СОЮЗНЫХ КРИПОВ
loop
set u6=FirstOfGroup(alliedcreeps)
exitwhen u6==null
if IsUnitType(u6, UNIT_TYPE_HERO) == true or IsUnitType(u6, UNIT_TYPE_ANCIENT) == true or IsUnitType(u6, UNIT_TYPE_STRUCTURE) == true or IsUnitAlly(u6,GetOwningPlayer(u5)) != true or IsDead(u6) == true or GetUnitAbilityLevelSwapped('Avul', u6) == 1 then
call GroupRemoveUnit(alliedcreeps,u6)
else
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer3.mdx",u6,"origin"))
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer3.mdx",u6,"chest"))
ДОБАВКА СПЛЕША U6
call SetPlayerAbilityAvailableBJ( false, 'A33H', GetOwningPlayer(u6) )
call UnitAddAbilityBJ('A33H', u6)
call UnitMakeAbilityPermanent(u6, true, 'A33H')
call UnitMakeAbilityPermanent(u6, true, 'A33G')
ДОБАВКА СПЛЕША U6 - ЗАКРЫТО.
call UnitRemoveAbilityBJ( 'Abun', u6 )
ПОВЫШЕНИЕ АТАКИ НА 30 И ЗДОРОВЬЯ НА 300
call SetUnitBaseDamage ( u6,(GetUnitBaseDamage(u6) + 30 ))
loop
exitwhen i >= 100
call UnitAddAbilityBJ('A25H', u6)
call SetUnitAbilityLevelSwapped('A25H', u6, 2)
call UnitRemoveAbilityBJ('A25H', u6)
set i=i+1
endloop
ПОВЫШЕНИЕ АТАКИ НА 30 И ЗДОРОВЬЯ НА 300 - ЗАКРЫТО.
set i = 0
call GroupRemoveUnit(alliedcreeps,u6)
endif
endloop
ВСЕ ДЕЙСТВИЯ С ГРУППОЙ СОЮЗНЫХ КРИПОВ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call TimerStart(t,0.15,false,function Overrun2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
call DestroyGroup (alliedcreeps)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, alliedcreeps
set t = null
set u5 = null
set u6 = null
set alliedcreeps = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function GiantGrowth2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("giantgrowth"),0)
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function GiantGrowth takes nothing returns nothing
local timer t = CreateTimer()
local unit u5=GetSpellAbilityUnit()
local group g=CreateGroup()
local unit u7
local unit temp_unit
local real r1=999999.9
local real x
local real y
local real giantgrowth = 0
local integer i = 0
set giantgrowth = LoadReal(udg_Hash,GetHandleId(u5),StringHash("giantgrowth"))
if ( GetSpellAbilityId() == 'A33C' ) and giantgrowth == 0 then
call PlaySoundOnUnitBJ( gg_snd_MaroSorcererGiantGrowth, 100, u5 )
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("giantgrowth"),1)
call GroupEnumUnitsInRect(g, GetPlayableMapRect(), null)
loop
set temp_unit=FirstOfGroup(g)
exitwhen temp_unit==null
if IsUnitAlly(temp_unit, GetOwningPlayer(u5)) and IsDead(temp_unit) == false and (not IsUnitType(temp_unit, UNIT_TYPE_ANCIENT)) and (not IsUnitType(temp_unit, UNIT_TYPE_STRUCTURE)) and (not IsUnitType(temp_unit, UNIT_TYPE_HERO)) and GetUnitAbilityLevelSwapped('Avul', temp_unit) != 1 then
set x=GetUnitX(temp_unit)-GetUnitX(u5)
set y=GetUnitY(temp_unit)-GetUnitY(u5)
if SquareRoot(x*x+y*y) < r1 then
set r1=SquareRoot(x*x+y*y)
set u7=temp_unit
endif
endif
call GroupRemoveUnit(g, temp_unit)
endloop
if u7!=null then
call DestroyEffect(AddSpecialEffectTarget("MaroSorcerer3.mdx", u7, "chest"))
ПОВЫШЕНИЕ АТАКИ НА 30 И ЗДОРОВЬЯ НА 300
call SetUnitBaseDamage ( u7,(GetUnitBaseDamage(u7) + 30 ))
loop
exitwhen i >= 100
call UnitAddAbilityBJ('A25H', u7)
call SetUnitAbilityLevelSwapped('A25H', u7, 2)
call UnitRemoveAbilityBJ('A25H', u7)
set i=i+1
endloop
ПОВЫШЕНИЕ АТАКИ НА 30 И ЗДОРОВЬЯ НА 300 - ЗАКРЫТО.
endif
call SaveUnitHandle(udg_Hash, GetHandleId(t),2,u5)
call TimerStart(t,0.15,false,function GiantGrowth2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
call DestroyGroup(g)
set t = null
set u5=null
set g=null
set u7=null
set temp_unit=null
endfunction
Может, если StringHash пытается вернуть или записать параметры на юнита, которого уже нет, то тогда создается проблема?
Если так, то надо пару уточнений/условий вписать, только четко правильно там, где надо...
///////
sic!!! Там вот еще что: создается очень много крипов, на каждого пишется
call SaveReal(udg_Hash,GetHandleId(u6),StringHash("elf_creaturetype"),1)
и, более того, часто запускаются ежесекундные таймеры, загружающие call SaveReal(udg_Hash,GetHandleId(u6),StringHash("elf_creaturetype"),1)
для КАЖДОГО существа раз в 5 секунд на карте вообще
Это перегружает память?
Тогда мб лучше по старинке для таких часто считываемых вещей абилку "маркер сущности эльфа" вешать?
0
16
6 лет назад
0
да, строковые параметры
походу, не используешь, тогда не знаю. От изменения чисел такого быть не может, от переполнения хештаблиц тоже не встречал такого эффекта.
0
21
6 лет назад
0
DracoL1ch, ну вот именно этот герой активно пишет в хэш стринги и считывает их и активно перезаписывает значения атаки, причем массово
ни один другой так не делает
я попробую все-таки тут подсократить количество этого дела (уже позже) и отпишусь
потому что тут ни одной новой функции не используется, но вот все старые юзаются очень активно, похоже, дело все-таки в количестве
/////
Просто у меня вообще уже была мысль убирать все абилки-маркеры на юнитах и заменять их на записи строкового хэша
Теперь вот уже спешить не буду, пока не разберусь здесь
(маркеры - абилки фактически пустышки, нужные для отметки, что с этим юнитом что-то делается, например, он классифицируется как эльф или на нем осталось висеть столько-то секунд такого-то триггерного дебаффа).
///
////////////
Upd еще идея появилась
Включу режим без кд и манакоста
Пикну героя, поставлю макс лвл синглплеерной командой
Каждый спелл отдельно его и только его прокастую по овердохрена раз
Буду выходить и проверять, будет фатал или нет
////
О_О так, любопытно, проверен первый спелл, были наставлены одновременно десятки пристов (в норм режиме их больше 4-7 одновременно не создается), все утонуло в лагах, т. к. там на каждого таймер периодический односекундный, но... фатала не было после 2 минут проверки и выхода из игры, а у меня была высокая уверенность, что там и будет.
///////
Ничего не понимаю. Продрочил кучу раз 4-й спелл, 100 секунд с начала игры, больше уже не смог, т. к. крипы все снесли, у них атака получилась под XXXX, а здоровье под XXXXX :D
Без лагов. Но тоже без фатала.
В 2 и 3 практически те же самые функции, только меньше...
/////////////
Уже была сыграна полная катка другим героем. Без фатала.
///
Опять катка за Мултани. После выхода из игры - фатал.
Придётся походу менять Priest of Titania на
www.hiveworkshop.com/data/ratory-images/93/93848-11cf52e835c6900... автокастовая на основе фрост армор, включать при изучении
www.hiveworkshop.com/threads/green-fireworks.48472/#resource-214... сразу на несколько аттачей дестройэффект
повысить союзному герою макс. ману на 3 + 3 за каждого эльфа в игре
ну мб да а мб и нет крч решим
ну и/или оптимайзнуть там код...
0
21
6 лет назад
Отредактирован ClotPh
0
///////////////////////
В общем, 90% уверенность, что это Прист.
Сейчас еще продрочилась при "без перезарядки" способность "Эльфийские бойцы" - она после вызова создает 2 подспособности, вызывающие эльфов (время жизни бесконечное, пока не убьют, но сами по себе эльфы слабоватые). Так вот за 5 минут тестовой игры (просто герой стоял на "дотакарте" и тупо с бесконечной маной кастил эльфов) было благополучно надрочено XXX эльфов, устроивших беготню по всей карте, но после игры фатала не было, то есть ниче страшного, что string хэш на каждого писался. Даже практически и не лагало (а вот это немного приятно удивило).
А вот после многострадальных Priest of Titania лаги начинались уже после 20-ти штук сильно заметные.
Прикол в том, что это предусмотрено и их в обычной игре без "втф мода" не будет стоять больше 2-3 сразу, но тем не менее... вообще еще подозреваю в том триге утечку, надо пересмотреть, т. к. лаги начинались не сразу, а после того, как наставишь двадцать, пять умрут и еще пять вылезут, что ли...
Еще вариант - переназову способность Untamed Wilds, но пусть дает макс. ману за каждого уж эльфа в игре максимальную, автокастом на основе духовного пламени длительностью 0.01 или еще чего подобного (решу), цели только союзные герои
/////
или как-то переоптимайзить код приста... чтобы только 1 там таймер был, после саммона приста смотреть, например, есть ли хоть один живой другой прист и если есть, то НЕ запускать таймер, а рушить его, а в таймере обрабатывать всех пристов... ну это если будет стоить овчинка выделки, прист все равно не очень удобный спелл
////////
///
А знаю!!! Прям ща сыграну катку за Мултани и не кастану ни одного приста. Если фатала не будет - все ясно, менять 1й скилл - вообще или программно.
////
Да, всё, без пристов фатала не было. Ну всё, значит, реворкать приста, но код оставлю, просто спрячу в комментах, если буду взамен спелл делать...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.