Добавлен scopterectus
scope StormHammer
globals
public constant integer ABILITY_ID = 'A019'
public constant integer THUNDERCLAP_ID = 'A00K'
public constant string THUNDERCLAP_ORDER = "thunderclap"
public constant string EFFECT_PATH = "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl"
public constant string LIGHTNING_NAME = "CLPB"
public constant real LIGHTNING_HEIGHT = 9900.0
public constant real LIGHTNING_LIFE_TIME = 0.1
endglobals
globals
public constant group enumUnits = CreateGroup()
public boolexpr boolexprForGroup = null
endglobals
public function Conditions takes nothing returns boolean
local integer abilityLevel = GetUnitAbilityLevel( GetAttacker(), ABILITY_ID )
local real currentMana = GetUnitState( GetAttacker(), UNIT_STATE_MANA )
local real abilityManaCost = GetAbilityManaCost( ABILITY_ID, abilityLevel )
local boolean a = ( abilityLevel >= 1 )
local boolean b = ( currentMana >= abilityManaCost )
local boolean c = ( not IsAbilityOnCooldown( GetUnitAbility( GetAttacker(), ABILITY_ID ) ) )
return ( a ) and ( b ) and ( c )
endfunction
public function GroupCallback takes nothing returns boolean
local unit filterUnit = GetFilterUnit()
local unit attackingUnit = bj_lastCreatedUnit
local player attackingUnitOwner = bj_groupEnumOwningPlayer
local boolean a = not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE)
local boolean b = IsUnitEnemy(filterUnit, attackingUnitOwner)
local boolean c = GetWidgetLife(filterUnit) > 0.405
if ( a ) and ( b ) and ( c ) then
call UnitDamageTarget( attackingUnit, filterUnit, 125.0, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
call CreateFloatingTextTag( null, FLOATING_TEXTTAG_CRITICAL_STRIKE, R2I( 125.0 ), GetUnitX( filterUnit ), GetUnitY( filterUnit ) )
endif
set filterUnit = null
set attackingUnit = null
return false
endfunction
public function Actions takes nothing returns nothing
local unit victim = GetTriggerUnit()
local unit attacker = GetAttacker()
local real victimZ = GetUnitFlyHeight(victim)
local real victimX = GetUnitX(victim)
local real victimY = GetUnitY(victim)
local integer abilityLevel = GetUnitAbilityLevel( attacker, ABILITY_ID )
local integer abilityManaCost = GetAbilityManaCost( ABILITY_ID, abilityLevel )
local real abilityCooldown = GetAbilityDataCooldown( GetUnitAbility( attacker, ABILITY_ID ), abilityLevel )
local real newManaState = GetUnitState( attacker, UNIT_STATE_MANA ) - abilityManaCost
call IssueImmediateOrder( attacker, "stop" )
call StartAbilityCooldown( attacker, ABILITY_ID, abilityCooldown )
call SetUnitState( attacker, UNIT_STATE_MANA, newManaState )
set bj_lastCreatedUnit = attacker
set bj_groupEnumOwningPlayer = GetOwningPlayer(attacker)
call GroupEnumUnitsInRange( enumUnits, victimX, victimY, 675.0, boolexprForGroup )
// call GroupClear(enumUnits)
set bj_lastCreatedUnit = null
set bj_groupEnumOwningPlayer = null
call CreateLightningTimed( LIGHTNING_NAME, true, victimX, victimY, LIGHTNING_HEIGHT, victimX, victimY, victimZ, LIGHTNING_LIFE_TIME )
call CasterCastAbilityImmediate( GetOwningPlayer(attacker), victimX, victimY, victimZ, THUNDERCLAP_ID, 1, THUNDERCLAP_ORDER )
call DestroyEffect( AddSpecialEffect( EFFECT_PATH, victimX, victimY ) )
set victim = null
set attacker = null
endfunction
endscope
function InitTrig_StormHammer takes nothing returns nothing
call PreloadAbility ( StormHammer_ABILITY_ID )
call PreloadAbility ( StormHammer_THUNDERCLAP_ID )
call PreloadEffect ( StormHammer_EFFECT_PATH )
call PreloadLightning( StormHammer_LIGHTNING_NAME )
set StormHammer_boolexprForGroup = Condition(function GroupCallback)
set gg_trg_StormHammer = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( gg_trg_StormHammer, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_StormHammer, Condition( function StormHammer_Conditions ) )
call TriggerAddAction( gg_trg_StormHammer, function StormHammer_Actions )
endfunction
Принятый ответ
ScopteRectuS, у тебя где то перезаписывается bj_lastCreatedUnit
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован scopterectus
булэкспы кэшируются так что только путаешься с этими переменными
так же функцию инициализации лучше перенести в scope
что касается урона
перед call UnitDamageTarget добавь вывод на экран имён attackingUnit и filterUnit
и функции лучше сделать приватными а не публичными
Отредактирован pro100master
Отредактирован Revenantik
лучше уж так
loop
pick = FirstOfGroup(enumUnits)
exitwhen pick==null
if GetWidgetLife(pick)>0.405 and not IsUnitType(pick,UNIT_TYPE_STRUCTURE) and IsUnitEnemy(pick, GetOwningPlayer(victim)) then
call UnitDamageTarget( victim, pick, 125.0, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
call CreateFloatingTextTag( null, FLOATING_TEXTTAG_CRITICAL_STRIKE, R2I( 125.0 ), GetUnitX( pick ), GetUnitY( pick ) )
endif
GroupRemoveUnit(enumUnits,pick)
endloop
т.к. является велосипедом
ScopteRectuS, 1 раз это при первом запуске системы?
или 1 раз при каждом вызове GroupEnumUnitsInRange?
и убери обнуление бж переменных наподобие bj_lastCreatedUnit
они ведь глобальные
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
Отредактирован scopterectus
Отредактирован nvc123
первая итерация нанесла урон
сработал триггер на получение урона и перезаписал переменные
пошла 2 итерация
новые потоки имеют приоритет над ещё работающем
т.е. если на середине кода стартанул 2 поток то будет выполнятся он а только потом 2 половина кода
на этом основаны некоторые фишки в вар3
например выдача невидимых предметов
и вообще я хз кто научил вас юзать бж переменные
как по мне за такое расстреливать надо
А за пояснения спасибо.
nvc123, хотел задать ещё один вопрос по выше написанному коду:
Если внутри функции GroupCallback() вызвать функцию GetAttacker(), то она почему-то возвращает того атакующего юнита, которого я пытался передать с помощью глобальных переменных. Это нормально вообще? Если всё и так работает, то зачем передавать данные с помощью глобальных переменных, когда можно получить юнитов с помощью подобных функции?