EugeAl, яды - отключаются сайленсами, в отличи от аур, всяких шипов жука, бонусов армора (предметы). Темный вовсе отдельная абилка морф, которая специально сделана заточенной под это.
Ну реализация очень простая, триггер на детект урона, триггер который следит какой предмет получил или выбросил герой. При получении нужного предмета смотрим есть герой в группе героев, если нету в группе - добавляем героя в группу и создаем событие в первом триггере - юнит получает урон.
При получении урона смотрим умер ли герой или нет, если нет подменяем предмет - не забываем спосощью глобальной переменной логического типа исключить на все эти действия срабатывание триггеров реагирующих на получение и выбрасывания предметов.
Ну далее реализуем общий таймер по которому будем считать когда кд откатится и предмет можно будет вернуть назад. Кд нужно связывать с героем а не предметом, то герои могут выкладывать предметы и подбирать их снова.
EugeAl, брехня, требование улучшение - тот же сайленс, все ауры пашут и прочее, там для таких абилок есть другой способ, апгрейды могут увеличивать уровень указанных способностей или менять в них некоторые поля ( у некромантов число и тип скелетов), абилка с 2мя уровнями, на первом ничего нет, на втором требуемый бонус.
EugeAl, с чего недолжно, сайленсы на пассивки итемов не работают, то если бы тебе кинули дум, у тебя бы защита исчезла к примеру от кольца защиты.
Конкретное кол-во маны под каждый уровень улучшения.
Потому что бездумно реализован детект урона, происходит рекурсия, нету никаких проверок. Ты наносишь урон в триггере который реагирует на урон, ну само собой вылетать будет. Такие вещи лучше реализовать на jass.
Вышла версия 1.6, появились фишки работы с фреймами, вроде таки сделал анрайз функции рисовать хп\мп бары, кулдауны, и прочее без дллок, там доработал работу фремов и оптимизировал код, чтение\запись памяти стало быстрее. Добавил некоторые функции для продвинутых, пользователей, изучил работу китайцев которые конвертируют карту в байткод для защиты, скоро будут карты в которых кроме длл... Много интересного, но для наших нубов бесполезное...
Там внезапно даже другой формат данных, модельки просто так не взять и вставить, офк народ брал вытаскивал и конвертировал, особо впечатлительные брали и делали с нуля модель по мотивам доты 2. На хайве поищи, но не думаю что всё из доты 2 удастся найти под варкравт.
Как то делал способность, которая похищает % атаки у врагов поблизости на несколько секунд, используя мемхак. Способность так то вроде не сложная в реализации, но вот про новичков наверное не по адресу, ибо написано на vjass. Если интересно прокоментирую код и обьясню что и зачем:
код
globals
integer HASH_EXTRA_DAMAGE_INDEX = 5
integer array abilityAddDamageLvl //Массив способностей для увеличения дополнительного урона
endglobals
function GetUnitExtraDamage takes unit u returns integer
local integer iD = GetHandleId( u )
local integer ammount
set ammount = LoadInteger( gg_htb_HashData, iD, HASH_EXTRA_DAMAGE_INDEX )
return ammount
endfunction
function SetUnitExtraDamage takes unit u, integer ammount returns nothing
local integer iD = GetHandleId( u )
local integer power = 12
local integer index = 0
local integer rest
if ammount > 8191 then
set ammount = 8191
endif
loop
call UnitRemoveAbility( u, abilityAddDamageLvl[index] )
exitwhen index == 12
set index = index + 1
endloop
if ammount > 0 then
set rest = ammount
loop
exitwhen rest <= 0
if R2I( Pow( 2, power ) ) > rest then
set power = power - 1
elseif R2I( Pow( 2, power ) ) <= rest then
call UnitAddAbility( u, abilityAddDamageLvl[power] )
call UnitMakeAbilityPermanent( u, true, abilityAddDamageLvl[power] )
set rest = rest - R2I( Pow( 2, power ) )
set power = power - 1
endif
endloop
call SaveInteger( gg_htb_HashData, iD, HASH_EXTRA_DAMAGE_INDEX, ammount )
endif
endfunction
function Only_Alive_Player_No_Dummy_No_Ward_Filter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return not ( IsUnitDead( bj_lastFilterUnit ) or IsUnitWard( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitIllusion( bj_lastFilterUnit ) or IsUnitHidden( bj_lastFilterUnit ) )
endfunction
function Group_Remove_Damage_Enum takes nothing returns nothing
local unit ally = GetEnumUnit( )
local TriggerData dd = bj_forceRandomConsidered
local integer bonus = R2I( GetUnitExtraDamage( ally ) - dd.dmg )
call UnitRemoveAbility( ally, 'B00H' )
call UnitRemoveAbility( ally, 'A0DV' )
call SetUnitExtraDamage( ally, bonus )
call SaveInteger( gg_htb_HashData, GetHandleId(ally), HASH_EXTRA_DAMAGE_INDEX, bonus )
call RemoveSavedHandle( gg_htb_HashData, ExSpeedSteal, GetHandleId(ally) )
set ally = null
endfunction
function Group_Add_Damage_Enum takes nothing returns nothing
local TriggerData dd = bj_forceRandomConsidered
local unit ally = GetEnumUnit( )
local integer bonus = 0
local integer pBuff
call TriggerRegisterDeathEvent( dd.trg, ally )
call SaveTriggerHandle( gg_htb_HashData, ExSpeedSteal, GetHandleId(ally), dd.trg )
call SetUnitExtraDamage( ally, R2I( GetUnitExtraDamage( ally ) + dd.dmg ) )
call UnitAddAbility( ally, 'A0DV' )
call UnitMakeAbilityPermanent( ally, true, 'A0DV' )
call UnitAddAbility( ally, 'A03W' )
set pBuff = GetUnitAbility( ally, 'B00H' )
if pBuff < 1 then
call BJDebugMsg(DEBUG+" "+ GetAbilityEffectById( 'A0DV', EFFECT_TYPE_SPECIAL, 1 ) )
call BJDebugMsg(INFO)
return
endif
set dd.c = TimerGetElapsed( DispTimer )
call SetBuffLevel( pBuff, dd.id )
call WMem( RMem( pBuff + 0x90 ) + 0x4, mR2I( dd.c + 15.10 ) )
call WMem( RMem( pBuff + 0x90 ) + 0x8, mR2I( dd.c + 10.408 ) )
call UnitRemoveAbilityTimed( ally, 'A03W', 0.00 )
set ally = null
endfunction
function Speed_Steal_damage_enemy takes nothing returns nothing
set TempDamage = TempDamage + GetUnitBaseDamage( GetEnumUnit( ) )
endfunction
function Trig_Speed_Steal_Buff_Expires_Conditions takes nothing returns boolean
local TriggerData dd
local unit dies
if ( GetTriggerEventId() == EVENT_WIDGET_DEATH ) then
set dd = GetDataBX( GetTriggeringTrigger( ) )
set dies = GetDyingUnit( )
if IsUnitInGroup( dies, dd.grp ) then
call GroupRemoveUnit( dd.grp, dies )
call SetUnitExtraDamage( dies, 0 )
call RemoveSavedHandle( gg_htb_HashData, ExSpeedSteal, GetHandleId(dies) )
call RemoveSavedInteger( gg_htb_HashData, GetHandleId(dies), HASH_EXTRA_DAMAGE_INDEX )
call UnitRemoveAbility( dies, 'A0DV' )
endif
set dies = null
return false
elseif ( GetTriggerEventId() != EVENT_GAME_TIMER_EXPIRED ) then
set dd = GetDataBX( GetTriggeringTrigger( ) )
set dies = bj_lastReplacedUnit
call GroupRemoveUnit( dd.grp, dies )
call SetUnitExtraDamage( dies, R2I( GetUnitExtraDamage( dies ) - dd.dmg ) )
call SaveInteger( gg_htb_HashData, GetHandleId(dies), HASH_EXTRA_DAMAGE_INDEX, R2I( GetUnitExtraDamage( dies ) - dd.dmg ) )
call RemoveSavedHandle( gg_htb_HashData, ExSpeedSteal, GetHandleId(dies) )
call UnitRemoveAbility( dies, 'A0DV' )
set dies = null
return false
endif
return true
endfunction
function Trig_Speed_Steal_Buff_Expires_Actions takes nothing returns nothing
local TriggerData dd = GetDataBX( GetTriggeringTrigger() )
call DisableTrigger( dd.trg )
set bj_forceRandomConsidered = dd
call ForGroup( dd.grp, function Group_Remove_Damage_Enum )
call ReleaseGroup( dd.grp )
call RemoveDataBX( dd.trg )
call dd.RemoveTrigger( )
call dd.destroy( )
endfunction
function Trig_Speed_Steal_Actions takes nothing returns nothing
local unit Runner = GetSpellAbilityUnit( )
local integer Level = GetUnitAbilityLevel( Runner, 'A03Q' )
local real CX = GetUnitX( Runner )
local real CY = GetUnitY( Runner )
local player pl = GetOwningPlayer( Runner )
local TriggerData dd
call GroupClear( gg_grp_TempGroup )
set bj_groupEnumOwningPlayer = pl
call GroupEnumUnitsInRange( gg_grp_TempGroup, CX, CY, 500.00, OnlyEnemy )
if FirstOfGroup( gg_grp_TempGroup ) != null then
set TempDamage = 0.00
call ForGroup( gg_grp_TempGroup, function Speed_Steal_damage_enemy )
if TempDamage > 1.00 then
set dd = TriggerData.create()
set dd.trg = CreateTrigger( )
set dd.trc = TriggerAddCondition( dd.trg, Condition( function Trig_Speed_Steal_Buff_Expires_Conditions ) )
set dd.tra = TriggerAddAction( dd.trg, function Trig_Speed_Steal_Buff_Expires_Actions )
set dd.grp = NewGroup()
set dd.dmg = ( 0.15 * Level ) * TempDamage
set dd.id = Level
call SetDataBX( dd.trg, dd )
call GroupEnumUnitsOfPlayer( dd.grp, pl, Condition( function Only_Alive_Player_No_Dummy_No_Ward_Filter ) )
set bj_forceRandomConsidered = dd
call ForGroup( dd.grp, function Group_Add_Damage_Enum )
call TriggerRegisterTimerEvent( dd.trg, 15.00, false )
endif
endif
set Runner = null
endfunction
function Init_ExtraDamageSystem takes nothing returns nothing
if abilityAddDamageLvl[0] > 0 then
return
endif
set abilityAddDamageLvl[0] = 'A0DS'
set abilityAddDamageLvl[1] = 'A0DA'
set abilityAddDamageLvl[2] = 'A0DK'
set abilityAddDamageLvl[3] = 'A0DL'
set abilityAddDamageLvl[4] = 'A0DM'
set abilityAddDamageLvl[5] = 'A0DN'
set abilityAddDamageLvl[6] = 'A0DO'
set abilityAddDamageLvl[7] = 'A0DP'
set abilityAddDamageLvl[8] = 'A0DQ'
set abilityAddDamageLvl[9] = 'A0DR'
set abilityAddDamageLvl[10] = 'A0DJ'
set abilityAddDamageLvl[11] = 'A0DT'
set abilityAddDamageLvl[12] = 'A0DU'
set bj_lastCreatedUnit = CreateUnit( Player( 15 ), 'hpea', 4435.41, 4295.44, 270.00 )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[0] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[1] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[2] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[3] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[4] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[5] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[6] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[7] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[8] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[9] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[10] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[11] )
call UnitAddAbility( bj_lastCreatedUnit, abilityAddDamageLvl[12] )
call ShowUnit( bj_lastCreatedUnit, false )
call KillUnit( bj_lastCreatedUnit )
endfunction
» WarCraft 3 / Руна создает утечку
» WarCraft 3 / Руна создает утечку
» WarCraft 3 / Руна создает утечку
Насчет утечек, точно потребление памяти постоянно растёт?
» WarCraft 3 / Руна создает утечку
» WarCraft 3 / Подкоп "скилы под ключ"
» WarCraft 3 / Экспоненциальный рост статы в улучшении
» WarCraft 3 / Что за особенность способностей основанных на +к характеристика?
» WarCraft 3 / отключение абилки предмета при получении урона
При получении урона смотрим умер ли герой или нет, если нет подменяем предмет - не забываем спосощью глобальной переменной логического типа исключить на все эти действия срабатывание триггеров реагирующих на получение и выбрасывания предметов.
Ну далее реализуем общий таймер по которому будем считать когда кд откатится и предмет можно будет вернуть назад. Кд нужно связывать с героем а не предметом, то герои могут выкладывать предметы и подбирать их снова.
» WarCraft 3 / Экспоненциальный рост статы в улучшении
» WarCraft 3 / Экспоненциальный рост статы в улучшении
Конкретное кол-во маны под каждый уровень улучшения.
» WarCraft 3 / Как заставить пламя феникса атаковать цели с наименьшим хп?
» WarCraft 3 / Вылетает при атаке
» WarCraft 3 / Мемхак для нуба
» WarCraft 3 / Мемхак для нуба
» WarCraft 3 / Как изменять значение атаки появляющихся саранчидов?
» WarCraft 3 / Эффекты аур\заклинаний из Dota 2
» WarCraft 3 / Нестабильная система опыта
» WarCraft 3 / Эффекты аур\заклинаний из Dota 2
» WarCraft 3 / Урон в зависимости от дальности
Ред. quq_CCCP
» WarCraft 3 / Вычислительная геометрия часть 2
» WarCraft 3 / деБафф плейсеры
» WarCraft 3 / Как называется анимация брызгов крови в редакторе?
Ред. quq_CCCP
» WarCraft 3 / Как создать подсчёт урона юнитов в области?
» WarCraft 3 / Фатал при загрузке сейва
» WarCraft 3 / Помогите найти карты детства
Exota