nvc123, нельзя, исключено. Тебе нужно снять эффект (допустим кастом стана), но не после смерти а до смерти, иначе будет баг (юнита больше не смогут застанить если это герой). А с баффами аур, когда им рисуешь псевдо длительность и прочее, тоже нужно избавляться вовремя...
Есть только одно событие которое срабатывает до смерти юнита (даже с крестом перерождения) - TriggerRegisterDeathEvent - это событие на конкретный виджет. Так же в триггер подвешиваем событие на каст диспелов, если юнит кастанул одну из диспелящих абилок в себя, или на него то рассеять бафф и утилизировать триггер.
Единственная необходимость плодить динамические триггеры - это мемхак и кастом баффы, там просто необходимо знать что хп упало до нуля (event widget death) а так же другие события...
Мне одному непонятно? Зачем это могло понадобится? Зачем вам удалять бафф ауры сразу? На то и сделана задержка обновления ауры 2 сек. Чтобы она не мерцала и не нагружать движок бесполезными действиями, пусть она висит без героя, эти пару секунд уж точно нечего не решит.
Занимайтесь более важными вещами, то все как один пишут на гуи, все спеллы в 3 строчки вроде кинуть дамми спелл на юнитов в аое, но блин ауру им надо переделать, со своей карты начните...
8gabriel8,есть ограничение памяти, когда оно будет исчерпано будет фатал, когда событие срабатывает вызывается поток триггера, и так много много раз, каждый поток требует пямять...
8gabriel8, нет, вам хватит юнитов 40+, и потом фатал, когда событий нациклится с тысячу. quq_CCCP, Ненужно делать на гуи все что требует работу с созданием триггеров, таймеров, групп...
Нет, нету однлкноплчных прог, которые защитят вам карту. Зезула читает все. Пох ему на спазлерры, прочие методы защиты мпк будут взломаны очень быстро - вышлют карту ладиславу зезуле, Там чувак написал либу по чтению мпк архивов, у него явно есть полные познание устройства мпк архивов и ваша защита там 5 мин не продержится..
Отошли времена, небудет больше спазлоров. Меняем свой код, делая нечитаемым ( перевод в байт код) данные о юнитах и итемах снимаем уакойнить тулой. После благодарямемхаку извлекаем в игре все эти данные... Там читеры будут очень долго ломать голову, с такой защитой небудет универсального и быстрого метода вшить Читы...
PogromINC59, могу, будет непросто - переписать весь код на jass...
Конвертор кода есть у драколича, ну и мемхак внедряем в свою карту.
Лучше использовать вторую версию из наработки детекта урона не говоря о том что должно быть все готово, оптимизировано и особым образом написано...
Ну это не запретит редактирование кода, а ограничит...
Собственно ретурн баг на Code
I2C(integer) C2I(code)...
При изменении кода, изменится и число получаемое c помощью I2C...
Ну там еще много способов, но все это несколько геморойно для практического применения...
Вроде собственной dll или написания кода карты байткодами...
Только дебаффы ядовитых стрел могут стакатся, но даммик обязан иметь дальнюю атаку (при условии что у разных абилок ядовитых стрел будут разные баффы в настройках).
Так же можно юзать таймер и ауру торнадо как написали выше, ну если уж совсем нужен сложный бафф как дефолтный - то тут триггер и немного гемора с мемхаком, зато полный комплект параметров (мигает иконка в статусе перед завершением время действия, бафф спадает с цели после диспела, смерти (у цели крест перерождения или аналог), складывается или не складывается в зависимости от кода).
Пример не рекомендуемый к повторению
function FormatAirportTrainingBar takes integer fp_n returns string
local string str = ""
if ( fp_n <= 0 ) then
return str
endif
loop
exitwhen fp_n < 10
if ( udg__TempBarStyle == 0 ) then
set str = str + "''''''''''"
else
set str = str + "||||||||||||||||||||"
endif
set fp_n = fp_n - 10
endloop
loop
exitwhen fp_n <= 0
if ( udg__TempBarStyle == 0 ) then
set str = str + "'"
else
set str = str + "||"
endif
set fp_n = fp_n - 1
endloop
return str
endfunction
function UpdateAirportTrainingBar takes texttag tt, integer fp_nTick, integer fp_nTickMax returns nothing
local integer nProgress
local integer nLen
local string strTT1
local string strTT2
if ( tt == null ) then
call BJDebugMsg( "text tag hDZzRwuZxFQcXqaMPnML null" )
return
endif
set nLen = R2I( I2R( fp_nTickMax ) / 300 * 100 )
set nProgress = R2I( I2R( nLen ) / fp_nTickMax * fp_nTick )
set strTT1 = "" + FormatAirportTrainingBar( nProgress )
set strTT2 = FormatAirportTrainingBar( nLen - nProgress ) + ""
call SetTextTagText( tt, "|cff0080c0" + strTT1 + "|r|cffff0000" + strTT2 + "|r", 0.023 )
endfunction
function Get_Staff_of_Purification takes unit runner returns item
set bj_forLoopAIndex = 0
set bj_lastCreatedItem = null
if GetUnitAbilityLevel( runner, 'Arun' ) == 0 then
return null
endif
loop
exitwhen bj_forLoopAIndex > 5
set bj_lastCreatedItem = UnitItemInSlot( runner, bj_forLoopAIndex )
if GetItemTypeId( bj_lastCreatedItem ) == 'I01A' then
return bj_lastCreatedItem
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
return bj_lastCreatedItem
endfunction
function Trig_RunnerDamageDetect_Conditions takes nothing returns boolean
if GetTriggerEventId( ) == EVENT_UNIT_DAMAGED then
return GetEventDamage( ) > 0.00 and GetEventDamageSource( ) != GetTriggerUnit( ) and GetEventDamageSource( ) != DummyAttacker
endif
return true
endfunction
function HealRunner takes nothing returns nothing
local DamageData dd = GetDataBX( GetExpiredTimer( ) )
call UnitRemoveAbility( dd.attacked, 'AMhp' )
call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp )
call RemoveDataBX( dd.trix )
call DestroyTimer( dd.trix )
call dd.clear( )
call dd.destroy( )
endfunction
function Trig_RunnerDamageLock_Actions takes nothing returns nothing
local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
local DamageData dd
local eventid id = GetTriggerEventId( )
if id == EVENT_GAME_TIMER_EXPIRED and st.id < st.time and st.attacked != null then
set st.id = st.id + 1
if GetUnitAbilityLevel( st.attacked, 'Bcyc' ) > 0 or GetUnitAbilityLevel( st.attacked, 'Bcy2' ) > 0 then
call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 585.00 )
else
call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 80.00 + GetUnitFlyHeight( st.attacked ) )
endif
call UpdateAirportTrainingBar( st.tt, 100 - R2I( st.dmg / st.hp * 100.00 ), 100 )
elseif id == EVENT_UNIT_DAMAGED and st.dmg < st.hp then
set dd = DamageData.create( )
set dd.trix = CreateTimer( )
set dd.attacked = st.attacked
set dd.dmg = GetEventDamage( )
set dd.hp = GetUnitState( dd.attacked, UNIT_STATE_LIFE )
call SetDataBX( dd.trix, dd )
call UnitAddAbility( dd.attacked, 'AMhp' )
call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp + dd.dmg )
call TimerStart( dd.trix, 0.00, false, function HealRunner )
set st.dmg = st.dmg + dd.dmg
else
call UnitRemoveAbility( st.attacked, 'A08L' )
call UnitMakeAbilityPermanent( st.attacked, false, 'A08L' )
call DisableTrigger( st.trg )
call SetTextTagVisibility( st.tt, false )
if not IsUnitDead( st.attacked ) then
call UnitRemoveAbility( st.attacked, 'B00A' )
endif
call RemoveSavedInteger( gg_htb_HashData, ExKeySoPRunner, GetHandleId( st.attacked ) )
call st.RemoveTrigger( )
call st.destroy( )
endif
set id = null
endfunction
function Trig_Staff_of_Purification_Actions takes nothing returns nothing
local TriggerData dd
local unit Runner = GetSpellAbilityUnit( )
local integer RunnerId = GetHandleId( Runner )
local item Staff = LoadItemHandle( gg_htb_HashData, RunnerId, ExKeySoP )
local integer ChargesCount = 0
local trigger trig = LoadTriggerHandle ( gg_htb_HashData, ExAtomShield, RunnerId )
local integer pBuff
if Staff == null then
set Staff = Get_Staff_of_Purification( Runner )
if Staff == null then
//call DisplayTextToPlayer( Player( CrashPlayerNumber ), 0.00, 0.00, I2Sx( 'A01Q', CrashPlayerNumber ) )
call BJDebugMsg( DEBUG + I2Sx( 'A02O', 0 ) + INFO )
return
endif
call SaveBoolean( gg_htb_HashData, RunnerId, ExKeyHasStaff, true )
call SaveItemHandle( gg_htb_HashData, RunnerId, ExKeySoP, Staff )
endif
set ChargesCount = GetItemCharges( Staff )
if ChargesCount < 1 then
set Runner = null
set Staff = null
set trig = null
return
endif
call SetItemCharges( Staff, 0 )
if trig != null then // блокирующие урон способности не складываются.
call TriggerExecute( trig )
set trig = null
endif
set dd = TriggerData.create( )
set dd.attacked = Runner
set dd.pl = GetOwningPlayer( Runner )
set dd.trg = CreateTrigger( )
set dd.trc = TriggerAddCondition( dd.trg, Condition( function Trig_RunnerDamageDetect_Conditions ) )
set dd.tra = TriggerAddAction ( dd.trg, function Trig_RunnerDamageLock_Actions )
set dd.tt = CreateTextTag( )
set dd.hp = 1000.00 * ChargesCount
set dd.dmg = 1.00
set dd.id = 0
set dd.time = 480
set dd.c = 0.03125
call UnitAddAbility( Runner, 'A07E' )
call UnitRemoveAbility( Runner, 'A07E' )
call UnitAddAbility( Runner, 'A08L' )
call UnitMakeAbilityPermanent( Runner, true, 'A08L' )
call SetDataBX( dd.trg, dd )
call SaveInteger( gg_htb_HashData, ExKeySoPRunner, RunnerId, dd )
call TriggerRegisterPlayerEvent( dd.trg, dd.pl, EVENT_PLAYER_LEAVE )
call TriggerRegisterDeathEvent( dd.trg, Runner )
call TriggerRegisterUnitEvent( dd.trg, Runner, EVENT_UNIT_DAMAGED )
call TriggerRegisterTimerEvent( dd.trg, 0.03125, true )
if GetLocalPlayer( ) == dd.pl or IsPlayerAlly( GetLocalPlayer( ), dd.pl ) then
call SetTextTagVisibility( dd.tt, true )
else
call SetTextTagVisibility( dd.tt, false )
endif
set pBuff = GetUnitAbility( dd.attacked, 'B00A' ) + 0x90
set dd.c = TimerGetElapsed( DispTimer )
call WMem( RMem( pBuff ) + 0x4, mR2I( dd.c + 15.10 ) )
call WMem( RMem( pBuff ) + 0x8, mR2I( dd.c + 10.408 ) )
call SetBuffLevel( pBuff - 0x90, ChargesCount )
call UpdateAirportTrainingBar( dd.tt, 100, 100 )
set Runner = null
endfunction
//===========================================================================
function InitTrig_Staff_of_Purification takes nothing returns nothing
set udg__TempBarStyle = 0
endfunction
Выше пример баффа для предмета, который образует щит блокирующий урон, кол-во заблокированного урона и сколько еще заблокирует щит отображается над головой героя, в виде полоски здоровья (только цвет сине-красный). Так же в статуе есть бафф, один в 1 как бафф дефектных способностей вара, не складывается - новый, перебивает старый. И так далее...
ADOLF, а рили будет апдейт cjass? То он много с чем не дружит, так же приходится спасать от его автоудаления ненужного кода глобалки и функции мемхака, которые нужны чтобы обойти защиту от возвращения не того типа...
ClotPh, Еще можно проверить ReadRealMemory вместо ReadMemory
Ну а фатал при выборе негероя - навреное ConvertHandle Кривая... там больше и фаталить нечему...
» WarCraft 3 / Утечки в системе динамических триггеров
Есть только одно событие которое срабатывает до смерти юнита (даже с крестом перерождения) - TriggerRegisterDeathEvent - это событие на конкретный виджет. Так же в триггер подвешиваем событие на каст диспелов, если юнит кастанул одну из диспелящих абилок в себя, или на него то рассеять бафф и утилизировать триггер.
Ред. quq_CCCP
» WarCraft 3 / Утечки в системе динамических триггеров
Там изи детект всех видов урона и есть даже пример как это сделать....
» WarCraft 3 / Зависание
» WarCraft 3 / Утечки в системе динамических триггеров
» WarCraft 3 / Аура которая сбрасывается сразу после покидания зоны действия
Занимайтесь более важными вещами, то все как один пишут на гуи, все спеллы в 3 строчки вроде кинуть дамми спелл на юнитов в аое, но блин ауру им надо переделать, со своей карты начните...
» WarCraft 3 / Утечки в системе динамических триггеров
Если в краце, это самый производительный алгоритм, на одном таймере.
» WarCraft 3 / Утечки в системе динамических триггеров
» WarCraft 3 / Утечки в системе динамических триггеров
» WarCraft 3 / Проверьте, пожалуйста, триггеры!
я про то что одно и тоже событие 10 раз повешать
» WarCraft 3 / Проверьте, пожалуйста, триггеры!
» WarCraft 3 / Не запускаются карты. Возможно беда со скриптами
» WarCraft 3 / Проверьте, пожалуйста, триггеры!
quq_CCCP, Ненужно делать на гуи все что требует работу с созданием триггеров, таймеров, групп...
Ред. Кет
» WarCraft 3 / Редактирование кода
Отошли времена, небудет больше спазлоров. Меняем свой код, делая нечитаемым ( перевод в байт код) данные о юнитах и итемах снимаем уакойнить тулой. После благодарямемхаку извлекаем в игре все эти данные... Там читеры будут очень долго ломать голову, с такой защитой небудет универсального и быстрого метода вшить Читы...
» WarCraft 3 / Редактирование кода
Конвертор кода есть у драколича, ну и мемхак внедряем в свою карту.
Лучше использовать вторую версию из наработки детекта урона
не говоря о том что должно быть все готово, оптимизировано и особым образом написано...
» WarCraft 3 / Редактирование кода
» WarCraft 3 / Редактирование кода
Собственно ретурн баг на Code
I2C(integer) C2I(code)...
При изменении кода, изменится и число получаемое c помощью I2C...
Ну там еще много способов, но все это несколько геморойно для практического применения...
Вроде собственной dll или написания кода карты байткодами...
» WarCraft 3 / Таргетные способности с таймером
Так же можно юзать таймер и ауру торнадо как написали выше, ну если уж совсем нужен сложный бафф как дефолтный - то тут триггер и немного гемора с мемхаком, зато полный комплект параметров (мигает иконка в статусе перед завершением время действия, бафф спадает с цели после диспела, смерти (у цели крест перерождения или аналог), складывается или не складывается в зависимости от кода).
» WarCraft 3 / Как создать пожар и тушение?
Тушить через диспел (или триггерную абилку, удаляя бафф).
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / Стандартная способность
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?
» WarCraft 3 / Хак на память Warcraft3
Чтобы был ро код как в редакторе - Id2String()
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
Ну а фатал при выборе негероя - навреное ConvertHandle Кривая... там больше и фаталить нечему...