Добавлен ClotPh
Всё ли в порядке?
-Новый предмет: Эфирная Линза!
Автособирается из Сферы энергии за 750 - итого 1500
Всё вижу голубыми глазами!
+200 к макс. мане
Голубой Глаз (пассивно).
За каждое применение способности "цель-объект" или "цель-точка/область" с перезарядкой 1 или больше восстанавливает ману в 4% от дальности применения.
Если дальность применения способности больше 200 и меньше 1000, она увеличивается на 50.
ЭФИРНАЯ ЛИНЗА
Автособирается из Сферы энергии за 750 - итого 1500
Всё вижу голубыми глазами!
+200 к макс. мане
Голубой Глаз (пассивно).
За каждое применение способности "цель-объект" или "цель-точка/область" с перезарядкой 1 или больше восстанавливает ману в 4% от дальности применения.
Если дальность применения способности больше 200 и меньше 1000, она увеличивается на 50.
ЭФИРНАЯ ЛИНЗА
function AetherLens_Actions takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
set p2 = GetSpellTargetLoc()
endif
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
set p2 = GetSpellTargetLoc()
endif
ТУТ ПРО ДОБАВКУ МАНЫ, ЕСЛИ КД АБИЛЫ НА ЭТОМ УРОВНЕ СЕЙЧАС >=1
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) and ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect ( AddSpecialEffectTarget( "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest" ) )
else
endif
ТУТ ПРО ДОБАВКУ МАНЫ, ЕСЛИ КД АБИЛЫ НА ЭТОМ УРОВНЕ СЕЙЧАС >=1 - ЗАКРЫТО.
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) and ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect ( AddSpecialEffectTarget( "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest" ) )
else
endif
ТУТ ПРО ДОБАВКУ МАНЫ, ЕСЛИ КД АБИЛЫ НА ЭТОМ УРОВНЕ СЕЙЧАС >=1 - ЗАКРЫТО.
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
if DistanceBetweenPoints(p,p2) > 200 and DistanceBetweenPoints(p,p2) < 1000 and GetAbilityDataHeroRng(a, i) > 200 and ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endif
endloop
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
loop
exitwhen i < 1
set i = i-1
if DistanceBetweenPoints(p,p2) > 200 and DistanceBetweenPoints(p,p2) < 1000 and GetAbilityDataHeroRng(a, i) > 200 and ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endif
endloop
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
call RemoveLocation (p)
call RemoveLocation (p2)
call RemoveLocation (p2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
===========================================================================
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
ЭФИРНАЯ ЛИНЗА - ЗАКРЫТО.
Затестировано в игре, пока проблем не обнаружено.
Принятый ответ
Код выше имеет вероятность вызвать фатал (от драколича инфа, что из-за чтения памяти по несуществующему адресу, я пока отталкиваюсь от того, что из-за несуществующей точки мб втч).
Уже был промежуточный вариант номер 2, он фатал вызвал сразу после сборки линзы, что подтверждает отчасти моё мнение...
Сейчас тестирую этот. По крайней мере линза с ним собралась уже без фатала.
Уже был промежуточный вариант номер 2, он фатал вызвал сразу после сборки линзы, что подтверждает отчасти моё мнение...
Сейчас тестирую этот. По крайней мере линза с ним собралась уже без фатала.
Новый тест код линзы (ща главное, чтобы работал)
ЭФИРНАЯ ЛИНЗА
function AetherLens_Actions takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
if GetSpellTargetLoc() != null then
set p2 = GetSpellTargetLoc()
endif
endif
if p2 != null then
if ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
if DistanceBetweenPoints(p,p2) > 200 then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest"))
if GetAbilityDataHeroRng(a, i) > 200 and GetAbilityDataHeroRng(a, i) < 1000 and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endloop
endif
endif
endif
call RemoveLocation (p2)
endif
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
if GetSpellTargetLoc() != null then
set p2 = GetSpellTargetLoc()
endif
endif
if p2 != null then
if ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
if DistanceBetweenPoints(p,p2) > 200 then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest"))
if GetAbilityDataHeroRng(a, i) > 200 and GetAbilityDataHeroRng(a, i) < 1000 and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endloop
endif
endif
endif
call RemoveLocation (p2)
endif
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
call RemoveLocation (p)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
===========================================================================
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
ЭФИРНАЯ ЛИНЗА - ЗАКРЫТО.
Если что: в первичном коде не было вообще предусмотрено, что точки p2 может не существовать и что в таком случае делать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Если хочешь, перепиши с полным сохранением функциональности без точек - спасибо скажу... Хотя мб и самостоятельно позже справлюсь, тут нетрудно, просто ща мозги спят уже.
Отредактирован quq_CCCP
Неужели нельзя все посчитать вначале, нет проверки на то что у юнита есть мана и сколько её, макс маны больше 2 и кол-во маны меньше максимума.
Измерение дистанции между локешинами не самая быстрая операция, так что если это итем, сделай по координатам, без извлечения корня вначале функции, так будет явно нагляднее и быстрее. Поможет в дальнейшем не задумыватся, че эт так фпс упало, на 101 таком скилле.
Уже был промежуточный вариант номер 2, он фатал вызвал сразу после сборки линзы, что подтверждает отчасти моё мнение...
Сейчас тестирую этот. По крайней мере линза с ним собралась уже без фатала.
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
if GetSpellTargetLoc() != null then
set p2 = GetSpellTargetLoc()
endif
endif
if p2 != null then
if ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
if DistanceBetweenPoints(p,p2) > 200 then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest"))
if GetAbilityDataHeroRng(a, i) > 200 and GetAbilityDataHeroRng(a, i) < 1000 and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endloop
endif
endif
endif
call RemoveLocation (p2)
endif
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction