Добавлен Alexander12,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Наработка
**1. Требуется редактор jngp(который может работать с мемхаком), либо jasscraft, либо иной способ, чтобы наработки с мемхаком корректно компились
- Сломанный массив Memory (который позволяет читать и писать в память)**
- Зачем это нужно ? для смены параметров скила (кд, дальность применения, и других данных), для определенного скила, который имеется у конкретного юнита
Собственно код.
function SetAbilityDataAInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ] = newdata
endif
endfunction
function GetAbilityDataAInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ]
endif
return 0
endfunction
function SetAbilityDataBInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] = newdata
endif
endfunction
function GetAbilityDataBInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9]
endif
return 0
endfunction
function SetAbilityDataCInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ] = newdata
endif
endfunction
function GetAbilityDataCInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ]
endif
return 0
endfunction
function SetAbilityDataDInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ] = newdata
endif
endfunction
function GetAbilityDataDInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ]
endif
return 0
endfunction
function SetAbilityDataEInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ] = newdata
endif
endfunction
function GetAbilityDataEInteger takes integer add,integer lvl,integer newdata returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ]
endif
return 0
endfunction
function SetAbilityDataAReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataAReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8] ))
endif
return .0
endfunction
function SetAbilityDataBReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataBReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] ))
endif
return .0
endfunction
function SetAbilityDataCReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10] ))
endif
return .0
endfunction
function SetAbilityDataDReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataDReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11] ))
endif
return .0
endfunction
function SetAbilityDataEReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataEReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12] ))
endif
return .0
endfunction
function SetAbilityDataCast takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 1 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCast takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 1 ] ))
endif
return .0
endfunction
function SetAbilityDataDur takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 2 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataDur takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +2] ))
endif
return .0
endfunction
function SetAbilityDataHeroDur takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 3 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroDur takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +3] ))
endif
return .0
endfunction
function SetAbilityDataCooldown takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 5 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCooldown takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +5] ))
endif
return .0
endfunction
function SetAbilityDataHeroArea takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 6 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroArea takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +6] ))
endif
return .0
endfunction
function SetAbilityDataHeroRng takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 7 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroRng takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +7] ))
endif
return .0
endfunction
function SetAbilityManaCostAddr2 takes integer add,integer lvl,integer mc returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 +(lvl-1)*26 + 4 ] = mc
endif
endfunction
function GetAbilityManaCostAddr2 takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 ]
endif
return 0
endfunction
function GetAbilityMaxLevel2 takes integer abil returns integer
return Memory[Memory[abil/4+0x54/4]/4+15]
endfunction
//Вспомогательные функции
function GetAbilityTableId takes integer a returns integer
return Memory[Memory[a/4+0x54/4]/4+0x54/4]
endfunction
function SetAbilityTableId takes integer a,integer TableId returns nothing
set Memory[Memory[a/4+0x54/4]/4+0x54/4] = TableId
endfunction
function GetAbilityDataId takes integer a returns integer
return Memory[a/4+0x54/4]
endfunction
function SetAbilityDataId takes integer a, integer DataId returns nothing
set Memory[a/4+0x54/4] = DataId
endfunction
// Копирование данных о скиле, и присвоению абилити новых данных.
function CloneAbilityData takes integer a returns nothing
local integer Address = malloc(23*4)
local integer AddressTabl = malloc(22*4+26*4*GetAbilityMaxLevel2(a) + 4 )
call CopyMemory(Address,GetAbilityDataId(a),22*4)
call CopyMemory(AddressTabl,GetAbilityTableId(a),26*4*GetAbilityMaxLevel2(a) + 4)
call SetAbilityTableId(a,AddressTabl)
call SetAbilityDataId(a,Address)
endfunction
чтобы можно было менять данные, нужно использовать функцию: function CloneAbilityData takes integer a returns nothing
для конкретного скила у конкретного юнита. после применения этой функции, можно модифицировать скил, рекомендовано, часто не использовать эту функцию.
для конкретного скила у конкретного юнита. после применения этой функции, можно модифицировать скил, рекомендовано, часто не использовать эту функцию.
Пример:
local integer a = GetUnitAbility(u,'A001')
call CloneAbilityData(a)
call SetAbilityDataHeroRng(a,1,5000)
call SetAbilityDataBReal(a,1,450)
call CloneAbilityData(a)
call SetAbilityDataHeroRng(a,1,5000)
call SetAbilityDataBReal(a,1,450)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
НО опять же - с глобальными изменениями кулдаунов таких траблов не было.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if (u6 != null) then
loop
exitwhen i > 10
set i = i+1
if GetAbilityDataHeroRng(a, i) < 99999 then
call SetAbilityDataHeroRng(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local integer i=LoadInteger(udg_Hash,GetHandleId(t),3)
local real r=LoadReal(udg_Hash,GetHandleId(t),4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitManaBJ( u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ) )
call SetUnitLifeBJ( u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ) )
endif
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call UnitRemoveAbilityBJ( 'A27A', u6 )
call UnitRemoveBuffBJ( 'B0H6', u6 )
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
endif
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call UnitMakeAbilityPermanent (u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction = TriggerAddAction(heroadded,function UnlimitedAbility)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveReal(udg_Hash,GetHandleId(t),4,r)
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
call SaveTriggerHandle(udg_Hash,GetHandleId(t),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),21,heroaction)
call TimerStart (t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
мне кажется, или ты каждый раз клонируешь абилку, даже если её не требуется модифицировать?
Дело только в этом? Вообще у кого-нибудь еще сабж фаталил подобным образом?
***
PS Ниже я Клон в принципе не могу поставить, проблема-то в том, что для вызова GetAbilityDataHeroRng УЖЕ надо абилку склонировать.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if (u6 != null) and UnitHasBuffBJ(u5,'B0H6') == true then
loop
exitwhen i > 10
set i = i+1
call CloneAbilityData(a)
if GetAbilityDataHeroRng(a, i) < 99999 then
call SetAbilityDataHeroRng(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t),21)
local integer i=LoadInteger(udg_Hash,GetHandleId(t),3)
local real r=LoadReal(udg_Hash,GetHandleId(t),4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitManaBJ( u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ) )
call SetUnitLifeBJ( u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ) )
endif
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call UnitRemoveAbilityBJ( 'A27A', u6 )
call UnitRemoveBuffBJ( 'B0H6', u6 )
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
endif
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call UnitMakeAbilityPermanent (u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction = TriggerAddAction(heroadded,function UnlimitedAbility)
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveReal(udg_Hash,GetHandleId(t),4,r)
call SaveInteger (udg_Hash,GetHandleId(t),3,i)
call SaveTriggerHandle(udg_Hash,GetHandleId(t),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),21,heroaction)
call TimerStart (t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
set t = null
set u5 = null
set u6 = null
set heroadded = null
set heroaction = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Отредактирован ClotPh
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6
local unit u5= GetTriggerUnit()
local unit u6= GetSpellTargetUnit()
local integer a= GetUnitAbility(u5 , GetSpellAbilityId())
local integer i= 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( u6 != null ) and UnitHasBuffBJ(u5, 'B0H6') == true then
loop
exitwhen i > 10
set i=i + 1
call CloneAbilityData(a)
if GetAbilityDataHeroRng(a , i) < 99999 then
call SetAbilityDataHeroRng(a , i , 99999)
call UnitRemoveAbilityBJ('A27A', u5)
call UnitRemoveBuffBJ('B0H6', u5)
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t= GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash, GetHandleId(t), 2)
local unit u6=LoadUnitHandle(udg_Hash, GetHandleId(t), 1)
local trigger heroadded=LoadTriggerHandle(udg_Hash, GetHandleId(t), 20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash, GetHandleId(t), 21)
local integer i=LoadInteger(udg_Hash, GetHandleId(t), 3)
local real r=LoadReal(udg_Hash, GetHandleId(t), 4)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call SaveInteger(udg_Hash, GetHandleId(t), 3, i)
call ConditionalTriggerExecute(gg_trg_destroyspeceffect)
call SetUnitManaBJ(u6, ( GetUnitStateSwap(UNIT_STATE_MANA, u6) + r ))
call SetUnitLifeBJ(u6, ( GetUnitStateSwap(UNIT_STATE_LIFE, u6) + r ))
endif
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
call UnitRemoveAbilityBJ('A27A', u6)
call UnitRemoveBuffBJ('B0H6', u6)
call TriggerRemoveAction(heroadded, heroaction)
call DestroyTrigger(heroadded)
endif
set t=null
set u5=null
set u6=null
set heroadded=null
set heroaction=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, heroadded, heroaction
local timer t= CreateTimer()
local unit u5= GetTriggerUnit()
local unit u6= GetSpellTargetUnit()
local trigger heroadded
local triggeraction heroaction
local real r
local integer i= 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
call UnitMakeAbilityPermanent(u6, true, 'A27A')
set heroadded=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(heroadded, EVENT_PLAYER_UNIT_SPELL_EFFECT)
set heroaction=TriggerAddAction(heroadded, function UnlimitedAbility)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u6)
call SaveReal(udg_Hash, GetHandleId(t), 4, r)
call SaveInteger(udg_Hash, GetHandleId(t), 3, i)
call SaveTriggerHandle(udg_Hash, GetHandleId(t), 20, heroadded)
call SaveTriggerActionHandle(udg_Hash, GetHandleId(t), 21, heroaction)
call TimerStart(t, 0.01, true, function Unlimited2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
set t=null
set u5=null
set u6=null
set heroadded=null
set heroaction=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
А там абилы жмутся!!!
Может быть, что из-за этого?! И чо тогда - абилы не жать или с фаталом смириться?
WarCraft III Widgetizer 1.9 - мб снять галочку с Abilities? Но насколько тогда ухудшится скорость игры и загрузки? На размер-то пофигу...
у тебя clone идет в цикле, создавая кучу мусора. достань его из цикла для начала.
раз у автора работает, то проблема в твоем написании где-то
***
Одна карта фаталит вар после выхода из него, если спелл юзается, другая нет. Втф?
А что вообще будет, кстати, если клонабилити не писать?
Функция не подействует, код не скомпилируется или?...
не знаю никаких багов, связанных со сжатием виджетайзером, тем более - если речь идет о том, что фатал именно в полной версии. сравни код, мб оптимизатор что-то поменял
Например, у тебя болт с 10 уровнями. Как и все скиллы, он хранит ссылку на свои данные внутри себя. двиг идет туда, зная уровень, который щас-щас вот кинут. В определенных адресах этой таблицы-структуры данных лежат длительность и урон. А перед этим идет ссылка на точный адрес начала данных, для страховки.
Болт 2: бла бла бла ссылка на другое место блаблалба
ну и да, если у тебя абилка гарантирвоано не повторяется, то и клонировать её не надо, очевидно. это так, мелочи уже