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 Кривая... там больше и фаталить нечему...
biridius, сударь дайте мне обычного героя, с нормальной анимацией, Который сделает хотя бы 2 тычки как вивер в доте, сразу же (орб оф слоу не юзать).
Увы только на мемхаке есть функции сброса кд абилки и функции для эмуляции атаки.
Насколько помню, записть листа абилок была нестабильна, норм работает только чтение...
function GetHeroAbilityFromList takes unit uHero, integer list returns integer
set LastConvertedHandle = ConvertHandle( uHero )
if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
return ReadMemory( ReadMemory( LastConvertedHandle + 496 ) + 240 + 4 * list )
endif
return 0
endfunction
LastConvertedHandle - адресс героя, 496 адрес абилки 'Aher' -герой, в её полях лежат способности для изучения, ну а 240 + каждые 4 байта это адреса абилок. т.е 244 это первая абилка в списке, 248 вторая и так далее....
8gabriel8, блин откуда вы взялись, никакая абилка не даст вам такой скорости, максимум 10 атак за сек, все хоть лопни. Быстрые тычки после основной никакими способностями на скорость атаки не сделать никак...
Вот это равносильно, взять продукты выспать на землю после покупки в магазине и принести домой пустой пакет, пытатся найти продукты в пакете...
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'A303' )\
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), true )
if not IssueTargetOrder(bj_lastCreatedUnit, "ensnare", u5 ) then
call BJDebugMsg("Ошибка - юнит не может применить ensnare")
endif
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), false )
Всегда давай вижен дамми юниту или создавай за игрока который гарантированно будет видеть цель, у цели может быть инвиз, цель может быть в тумане войны (только что созданный юнит, если его корды не равны корды цели увидит цель лиш спустя 0.4 сек.)
Проверяй может ли дамми выполнить приказ, могут быть ошибки в настройки способности, в фильтре допустимых для спелла целей...
Вот пример того как я создаю дамми юнита для каста некой абилки:
8gabriel8, как вы собрались проверять кол-во брони, это только в мемхаке есть функция узнать текущую белую и зеленую броню, другие способы из области фантастики, пили базу данных всех баффов, дебафов, юнитов,предметов...
Есть вещи которые вот так просто в 1 клик, как вы делайте в гуи не сделать... И хоть ты тресни, либо не делай ничего либо делай как говорят, третьего не дано.
avuremybe, xgm.guru/p/wc3/damagedetect
Вот и детект типов урона, атаки, проверки является ли урон атакой ближнего\дальнего боя, уроном от модификатора (к примеру ракеты паравого танка).
» 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 Кривая... там больше и фаталить нечему...
» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?
Увы только на мемхаке есть функции сброса кд абилки и функции для эмуляции атаки.
Ред. quq_CCCP
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?
» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?
» WarCraft 3 / Сглаз
» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?
» WarCraft 3 / Критические ошибки
Мб код карты в студию (или карту).
Ред. quq_CCCP
» WarCraft 3 / Почему в этом коде даммик не кидает сетку
Проверяй может ли дамми выполнить приказ, могут быть ошибки в настройки способности, в фильтре допустимых для спелла целей...
Вот пример того как я создаю дамми юнита для каста некой абилки:
» WarCraft 3 / Процент повышения брони
Есть вещи которые вот так просто в 1 клик, как вы делайте в гуи не сделать... И хоть ты тресни, либо не делай ничего либо делай как говорят, третьего не дано.
» WarCraft 3 / Критические ошибки
» WarCraft 3 / Процент повышения брони
» WarCraft 3 / Процент повышения брони
» WarCraft 3 / Как узнать тип урона
Вот и детект типов урона, атаки, проверки является ли урон атакой ближнего\дальнего боя, уроном от модификатора (к примеру ракеты паравого танка).