В локалке у тебя только индекс структуры. Тобишь integer. Просто передай его в нужную функцию.
ну а как собственно ее передать. Я когда сохраняю ее и выгружаю в другой функции, то постоянно ошибки выдает, например что переменная ключа незадекларированная, которую я пытаюсь передать. А если декларирую, то уже другой хендл выдает
library ArmorSystem initializer Init
globals
private integer array abilityAddArmor //Массив способностей для повышения брони
private integer HASH_EXTRA_ARMOR_INDEX = 4 //Данные о бонусном уроне, полученном с помощью системы будут хранится в хэш - таблице за хендлом юнита, под этим ключём
endglobals
//Узнать дополнительную броню
function GetUnitExtraArmor takes unit u returns integer
local integer iD = GetHandleId( u )
local integer ammount
set ammount = LoadInteger( gg_htb_HashData, iD, HASH_EXTRA_ARMOR_INDEX )
return ammount
endfunction
//Задать бонусную защиту (выше 8191 не поднять)
function SetUnitExtraArmor takes unit u, integer ammount returns nothing
local integer iD = GetHandleId( u )
local integer power = 13
local integer index = 0
local integer rest
if ammount > 8191 then
set ammount = 8191
endif
loop
call UnitRemoveAbility( u, abilityAddArmor[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, abilityAddArmor[power] )
set rest = rest - R2I( Pow( 2, power ) )
set power = power - 1
endif
endloop
call SaveInteger( gg_htb_HashData, iD, HASH_EXTRA_ARMOR_INDEX, ammount )
endif
if ammount == 0 then
call RemoveSavedInteger( gg_htb_HashData, iD, HASH_EXTRA_ARMOR_INDEX )
endif
endfunction
private function Init takes nothing returns nothing
local unit dummy = CreateUnit( Player( 9 ), 'hpea', 0.00, 0.00, 0.00 )
local integer nIndex = 0
call ShowUnit( dummy, false )
//Добавить защиту
set abilityAddArmor[0] = 'A0B7'
set abilityAddArmor[1] = 'A0B8'
set abilityAddArmor[2] = 'A0B9'
set abilityAddArmor[3] = 'A0BA'
set abilityAddArmor[4] = 'A0BB'
set abilityAddArmor[5] = 'A0BC'
set abilityAddArmor[6] = 'A0BD'
set abilityAddArmor[7] = 'A0BE'
set abilityAddArmor[8] = 'A0BF'
set abilityAddArmor[9] = 'A0BJ'
set abilityAddArmor[10] = 'A0BG'
set abilityAddArmor[11] = 'A0BH'
set abilityAddArmor[12] = 'A0BI'
loop
exitwhen nIndex > 12
call UnitAddAbility( dummy, abilityAddArmor[nIndex] )
set nIndex = nIndex + 1
endloop
call RemoveUnit( dummy )
set dummy = null
endfunction
endlibrary
function Trig_Summon_Lava_Spawn_Actions takes nothing returns nothing
local unit LavaSpawn = GetEnteringUnit( )
local unit Runner = gg_unt_PlayerHeroUnits[ GetPlayerId( GetOwningPlayer( LavaSpawn ) ) ]
local integer id
local TriggerData dd
local TriggerData st
call SetUnitUserData( LavaSpawn, 1 )
call SetUnitAbilityLevel( LavaSpawn, 'A0B6', GetUnitTypeId( LavaSpawn ) - 'elv0' )
if GetUnitAbilityLevel( Runner, 'A09S' ) == 0 then
set LavaSpawn = null
set Runner = null
return
endif
set st = LoadInteger( gg_htb_HashData, ExReactiveArmor, GetHandleId( Runner ) )
set dd = TriggerData.create( )
set dd.attacked = LavaSpawn
set dd.pl = GetOwningPlayer( Runner )
set dd.trg = CreateTrigger( )
set dd.trc = TriggerAddCondition( dd.trg, Condition( function Trig_Reactive_Armor_Conditions ) )
set dd.tra = TriggerAddAction( dd.trg, function Trig_Reactive_Armor_Actions )
set dd.id = 0
set dd.c = 0
set dd.ExCount = ( st.ExCount / 4 ) * 2 + 2
call TriggerRegisterUnitEvent( dd.trg, LavaSpawn, EVENT_UNIT_DAMAGED )
call TriggerRegisterUnitEvent( dd.trg, LavaSpawn, EVENT_UNIT_DEATH )
call UnitAddAbility( LavaSpawn, 'A06V' )
call UnitMakeAbilityPermanent( LavaSpawn, true, 'A06V' )
call SetDataBX( dd.trg, dd )
call SaveInteger( gg_htb_HashData, ExReactiveArmor, GetHandleId( LavaSpawn ), dd )
call SaveUnitHandle( gg_htb_HashData, GetHandleId( LavaSpawn ), 1, Runner )
set LavaSpawn = null
set Runner = null
endfunction
//===========================================================================
function InitTrig_Summon_Lava_Spawn takes nothing returns nothing
set gg_trg_Summon_Lava_Spawn = CreateTrigger( )
//call TriggerAddCondition( gg_trg_Summon_Lava_Spawn, Condition( function Trig_Summon_Lava_Spawn_Conditions ) )
call TriggerAddAction( gg_trg_Summon_Lava_Spawn, function Trig_Summon_Lava_Spawn_Actions )
endfunction
globals
constant real MeltingDamage = 4.25 // дополнительнй урон за удар.
endglobals
function Trig_Lava_Spawn_Conditions takes nothing returns boolean
local integer id
if GetTriggerEventId( ) == EVENT_PLAYER_UNIT_SPELL_EFFECT then
return GetSpellAbilityId( ) == 'A0B6'
elseif GetTriggerEventId( ) == EVENT_PLAYER_UNIT_ISSUED_ORDER and GetUnitAbilityLevel( GetOrderedUnit( ), 'A0B6' ) > 0 then
// включил или выключил игрок автоматическое применение, необходимо чтобы не создавать лишние триггеры!
set bj_lastCreatedUnit = GetOrderedUnit( )
set id = GetIssuedOrderId( )
if ( id == 852255 ) then // poison arrows
call SetUnitUserData( bj_lastCreatedUnit, 1 )
elseif ( id == 852256 ) then // unpoison arrows
call SetUnitUserData( bj_lastCreatedUnit, 0 )
endif
return false
endif
set id = GetUnitTypeId( GetAttacker( ) )
set bj_lastFilterUnit = GetTriggerUnit( )
// только для 'elv1'-'elv3' по не зданиям, не иммунным к магии, не вардам.
return ( id == 'elv1' or id == 'elv2' or id == 'elv3' ) and not( IsUnitWard( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ))
endfunction
function Timer_LavaSpawn_Stop_Check takes nothing returns nothing
local TriggerData st = GetDataBX( GetExpiredTimer( ) )
set st.IsCheck = true
call TriggerRegisterTimerExpireEvent( st.trg, st.trix )
call TimerStart( st.trix, 1.75, false, null )
endfunction
function Trig_Incinerate_Conditions takes nothing returns boolean
local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
if GetTriggerEventId( ) == EVENT_UNIT_DAMAGED then
return GetEventDamage( ) >= 0.00 and GetUnitAbilityLevel( GetTriggerUnit( ), 'B02E' ) > 0 and GetEventDamageSource( ) == st.attacker
elseif GetTriggerEventId( ) == EVENT_UNIT_ISSUED_ORDER and st.IsCheck then
return false
endif
call DisableTrigger( st.trg )
call TimerStart( st.trix, 0.01, false, function Remove_Sun_Shell_Timer_Expires )
return false
endfunction
function Trig_Incinerate_Actions takes nothing returns nothing
local TriggerData dd = GetDataBX( GetTriggeringTrigger( ) )
if GetTriggerEventId( ) == EVENT_GAME_TIMER_EXPIRED and GetTriggerEvalCount( dd.trg ) < dd.time then
if IsUnitDead( dd.attacker ) and not IsUnitType( dd.attacker, UNIT_TYPE_HERO ) then
set dd.attacker = dd.dummy
endif
call UnitDamageTarget( dd.attacker, dd.attacked, dd.dmg, true, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
else
call DisableTrigger( dd.trg )
call SetUnitExtraArmor( dd.attacked, 0 )
call UnitRemoveAbility( dd.attacked, 'Ainc' )
if not IsUnitDead( dd.attacked ) then
call UnitRemoveAbility( dd.attacked, 'Binc' )
endif
call RemoveSavedHandle( gg_htb_HashData, ExIncinirate, GetHandleId( dd.attacked ) )
call dd.RemoveTrigger( )
call dd.destroy( )
endif
endfunction
function Init_Trig_Incinerate takes nothing returns nothing
local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
local integer id = GetHandleId( st.attacked )
local TriggerData dd
local trigger trig = LoadTriggerHandle( gg_htb_HashData, ExIncinirate, id )
call DisableTrigger( st.trg )
call UnitRemoveAbility( st.attacked, 'B02E' )
if trig == null then
set dd = TriggerData.create( )
set dd.trg = CreateTrigger( )
set dd.tra = TriggerAddAction( dd.trg, function Trig_Incinerate_Actions )
set dd.attacker = st.attacker
set dd.attacked = st.attacked
set dd.dummy = LoadUnitHandle( gg_htb_HashData, GetHandleId( dd.attacker ), 1 )
set dd.id = 1
set dd.dmg = MeltingDamage
set dd.time = 6
call TriggerRegisterDeathEvent( dd.trg, dd.attacked )
call TriggerRegisterTimerEvent( dd.trg, 1.00, true )
call UnitAddAbility( dd.attacked, 'Ainc' )
call SetDataBX( dd.trg, dd )
call SaveTriggerHandle( gg_htb_HashData, ExIncinirate, id, dd.trg )
else
set dd = GetDataBX( trig )
set dd.attacker = st.attacker
set dd.attacked = st.attacked
set dd.dummy = LoadUnitHandle( gg_htb_HashData, GetHandleId( dd.attacker ), 1 )
set dd.id = dd.id + 1
set dd.dmg = MeltingDamage * dd.id
call ResetTrigger( dd.trg )
endif
if not IsUnitDead( dd.attacked ) then
call SetUnitExtraArmor( dd.attacked, dd.id )
endif
call UnitDamageTarget( dd.attacker, dd.attacked, dd.dmg, true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call TimerStart( st.trix, 0.01, false, function Remove_Sun_Shell_Timer_Expires ) // утилизация триггера.
set trig = null
return
endfunction
function Trig_Lava_Spawn_Actions takes nothing returns nothing
local unit LavaSpawn
local unit enemy
local TriggerData st
local boolean bStrike = true
if GetTriggerEventId( ) == EVENT_PLAYER_UNIT_SPELL_EFFECT then // автокаст применен через хоткей
set LavaSpawn = GetSpellAbilityUnit( )
set enemy = GetSpellTargetUnit( )
else // автоматическое применение
set LavaSpawn = GetAttacker( )
set enemy = GetTriggerUnit( )
set bStrike = GetUnitState( LavaSpawn, UNIT_STATE_MANA ) > ( 15.00 * GetUnitAbilityLevel( LavaSpawn, 'A0B6' ) ) and GetUnitUserData( LavaSpawn ) > 0 and GetUnitAbilityLevel( LavaSpawn, 'BNso' ) < 1
endif
if bStrike then // проверка был ли применен автокаст, чтобы создать триггер детектор урона.
set st = TriggerData.create( )
set st.trg = CreateTrigger( )
set st.trix = CreateTimer( )
set st.trc = TriggerAddCondition( st.trg, Condition( function Trig_Incinerate_Conditions ) )
set st.tra = TriggerAddAction( st.trg, function Init_Trig_Incinerate )
set st.attacker = LavaSpawn
set st.attacked = enemy
set st.IsCheck = false
call SetDataBX( st.trg, st )
call SetDataBX( st.trix, st )
call TriggerRegisterUnitEvent( st.trg, enemy, EVENT_UNIT_DAMAGED )
call TriggerRegisterUnitEvent( st.trg, enemy, EVENT_UNIT_DEATH )
call TriggerRegisterUnitEvent( st.trg, LavaSpawn, EVENT_UNIT_ISSUED_ORDER )
call TimerStart( st.trix, 0.25, false, function Timer_LavaSpawn_Stop_Check )
endif
set LavaSpawn = null
set enemy = null
endfunction
//===========================================================================
function InitTrig_Lava_Spawn takes nothing returns nothing
set gg_trg_Lava_Spawn = CreateTrigger( )
call DisableTrigger( gg_trg_Lava_Spawn )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Lava_Spawn, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Lava_Spawn, Condition( function Trig_Lava_Spawn_Conditions ) )
call TriggerAddAction( gg_trg_Lava_Spawn, function Trig_Lava_Spawn_Actions )
endfunction
Ну как, триггерно, я такое делал. Собственно потребуется детект физического урона, и куча абилок на минус защиты сделаных из абилки кольца защиты, 13 абилок со степенями двойки ну и все. Код могу скинуть, но судя по вопросу ты не разберешся...
Ред. hdhen321
» WarCraft 3 / Сохранение и перенос локальной структуры
Ред. hdhen321
» WarCraft 3 / Сохранение и перенос локальной структуры
» WarCraft 3 / Юнит, снижающий броню при уроне
» WarCraft 3 / Юнит, снижающий броню при уроне
» WarCraft 3 / Как найти юнита-строителя?
» WarCraft 3 / Имитация третьего ресурса заместо пищи