Там тебе придется скачать архив 3 гигибайта, открыть опенсорс или .j файл и найти нужный код в папке Indigene (CriticalAura вроде триг называется), но там уже все готовенькое, только способности имеющиеся скопировать (криты и спеллбуки и ауру) и их равкоды при необходимости поменять. Не идеальный код, но производительный и сразу действует. А может не только для этого пригодиться, в архиве много еще чего вкусного для вара и не только, втч опенсорсов как минимум не самых худших заклинаний =)
Моё дело предложить, короче, имхо в 2017 три гига много кому утянуть не сложнее, чем на улицу до магазина сбегать.
Ссылка сейчас умрёт, новая тут будет сегодня
Дошло, в чем еще могла быть проблема в том варианте кода.
Автосборка вещей происходит следующим образом. Есть вещь, есть активка-спеллбук со списком вещей и их ценой в золоте за улучшение базовой вещи (типа шмотки на +X к силе) в любую покруче (типа тех же дотовских барабанов).
При юзании активки, если золота достаточно, оно тратится, вещь исчезает и появляется другая (кстати, эту систему практически все хвалили, в совокупности с перезакупом очень удобно).
Так вот прикол в следующем... когда юзается одна из способностей спеллбука в предмете (а именно тогда фаталило), Aether Lens пытается посчитать ее параметры, ориентируясь на применившего героя. Но у героя-то эта способность пропадает вместе с предметом - предмет превращается в другой. Может, тут что-то и глючило.
Ну ладно, новый вариант кода еще посмотрим.
///////////
Added: пофлужу немного - четвертая игра подряд с линзой с новым кодом, 20 минут (для катки с ботами в ускоренном режиме это много), фатала нет. Ну см. выше.
Но сами-то по себе все функции мной ранее юзались и фатала ВО ВРЕМЯ игры НЕ вызывали.
Вероятно, несуществующая память пытается считаться все-таки из-за неправильного их использования при несуществующей точке.
Короче, инфа не сотка, но три игры подряд с линзой в последнем варианте ее кода по ссылке - фатала во время игры не было (но в прошлой версии он вроде как раз на третьей игре и словился, так что еще не факт, но все-таки...) В общем, за***ло, уже сегодня отдыхать планировалось (так вот отдых и начался... вместо отдыха фатал и снова лезть фиксить), ща еще каточку в хотс сыграю и все, наверное, будет вечером-ночью перезаписано и залито, если что, апну и эту тему, как и тему с Психопомпой (но там-то не так страшно), если никто не сможет помочь - буду дальше экспериментировать самостоятельно.
Что лучше юзать новый мемхак - уже ясно.
Код выше имеет вероятность вызвать фатал (от драколича инфа, что из-за чтения памяти по несуществующему адресу, я пока отталкиваюсь от того, что из-за несуществующей точки мб втч).
Уже был промежуточный вариант номер 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 ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА
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
===========================================================================
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 может не существовать и что в таком случае делать.
То есть все функции с гитхаба неочень и нужно с нового мемхака в теме забирать? Там эти проверки уже встроенные и/или не нужные?
А то я тут что-то еще на точку грешу, что неправильно может определяться. Когда писался код, отталкивалось от того, что если спелл без указания цели, то GetSpellTargetLoc() - это точка кастера. Теперь уже сомневаюсь и кажется, что в таком случае точки вообще нет и начинается черт знает что...
В любом случае ведь все эти функции юзались уже в др. местах, а фаталов не вызывали, фатал был до этого только после игр, а не во время, уже новая вчера залитая версия удалена, ща вот Линзу мучаю.
Если что, тема вот прямо связанная
Что такое, почему ничего не прикрепляется.
Ладно, вроде вот
Файл.
Пока переписываю самостоятельно, там все равно ифзенэлсы косые были под завершение кодинга на усталую голову. Короче, вынесу замер дистанции в верхний ифзенэлс и еще выше наличие предмета, если там будет меньше нужного, то все остальное просто не должно будет проверяться и делаться, а при юзании автосборки из спеллбука дистанция по определению 0... так что вроде должно все исправиться.
Но если у кого-то есть комменты, пишите, причина фатала конкретно интересует все равно.
JyHgle, когда ты по-русски писать научишься.
Вбрасываю в таком виде, в каком силы есть вбросить и желание после всего кодинга и тестов, см. выше. Если модеры вставят кат, не побив вложенный файл - спасибо.
Все равно продолжает фаталить, причина та же?
Одно радует, что Психопомпа все равно все улучшается, хотя еще ни с одним героем за всю историю существования игры столько мороки не было, ну, пока фатал будет фирменной фичей =), пост-игры он не так уж мешает, но все же лучше бы без него... war3map.j-шка почти та же самая в плане интересующих функций, выкладываю только все последние связанные с Психопомпой функции, ульт вообще переделан.
Сорри, что без ката, все никак не войдет в автокаст, как тут этот кат делать.
раскрыть
function PerceptionEffect takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
//ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ АТАКУ С ШАНСОМ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27T', u5) >= 1 ) then
if (GetRandomInt(1,5) == 1) then
call DestroyEffect(AddSpecialEffectTarget("Psychopomp4.mdx", u5, "origin"))
call SetUnitBaseDamage ( u5, ( GetUnitBaseDamage(u5) + GetUnitAbilityLevelSwapped('A27T',u5) ) )
else
endif
else
endif
endloop
//ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ АТАКУ С ШАНСОМ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function DelicacyEffect takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
//ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27S', u5) >= 1 ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + 4 * GetUnitAbilityLevelSwapped('A27S',u5))
else
endif
endloop
//ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function BendingEffect takes nothing returns nothing
local real percent = 1.00
local real percent2 = 0.00
local integer i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
local integer percentchange = 0
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
//УВЕЛИЧЕНИЕ НА 1%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif
//НА 1% - ЗАКРЫТО.
//УВЕЛИЧЕНИЕ НА 2%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif
//НА 2% - ЗАКРЫТО.
//УВЕЛИЧЕНИЕ НА 3%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif
//НА 3% - ЗАКРЫТО.
//УВЕЛИЧЕНИЕ НА 4%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif
//НА 4% - ЗАКРЫТО.
//УВЕЛИЧЕНИЕ НА 5%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif
//НА 5% - ЗАКРЫТО.
//ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1
//ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
if (percent > 1.00) then
call AddSpecialEffectTargetUnitBJ( "chest", GetTriggerUnit(), "Psychopomp2.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
loop
exitwhen i < 1
set i = i-1
//ОКРУГЛЕНИЕ ДО СОТЫХ (ИНАЧЕ МОГУТ ЗАПИСАТЬСЯ ДОП. ЦИФРЫ НЕ В ТЕ ЯЧЕЙКИ)
loop
exitwhen i < 1
set i=i - 1
set percent2 = GetAbilityCD(GetSpellAbilityId(), i) * percent
set percent2 = percent2 * 100
set percentchange = R2I(percent2)
set percent2 = I2R(percentchange)
set percent2 = percent2 * 0.01
call SetAbilityCD(GetSpellAbilityId() , i , percent2)
endloop
//ОКРУГЛЕНИЕ ДО СОТЫХ - ЗАКРЫТО.
endloop
else
endif
else
endif
endfunction
function PerceptionRefresh takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t12, t13, t14, u5, u6, heroadded, heroaction, herounits
local timer t12 = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t12),2)
local unit u6
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t12),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t12),21)
local group herounits
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t12)
call DestroyTimer(t12)
call FlushChildHashtable(udg_Hash,GetHandleId(t12))
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
else
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
set heroadded=CreateTrigger()
set heroaction = TriggerAddAction(heroadded,function PerceptionEffect)
set herounits = GetUnitsInRectAll(GetPlayableMapRect())
loop
set u6=FirstOfGroup(herounits)
exitwhen u6==null
call GroupRemoveUnit(herounits,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitType(u6, UNIT_TYPE_HERO) == true ) then
call TriggerRegisterUnitEvent(heroadded, u6, EVENT_UNIT_SPELL_EFFECT)
else
endif
endloop
call DestroyGroup (herounits)
call SaveTriggerHandle(udg_Hash,GetHandleId(t12),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t12),21,heroaction)
endif
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t12, t13, t14, u5, u6, heroadded, heroaction, herounits
set t12 = null
set u5 = null
set u6 = null
set heroaction = null
set heroadded = null
set herounits = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function DelicacyRefresh takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t11, u5, u6, heroadded, heroaction, herounits
local timer t11 = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t11),2)
local unit u6
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t11),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t11),21)
local group herounits
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t11)
call DestroyTimer(t11)
call FlushChildHashtable(udg_Hash,GetHandleId(t11))
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
else
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
set heroadded=CreateTrigger()
set heroaction = TriggerAddAction(heroadded,function DelicacyEffect)
set herounits = GetUnitsInRectAll(GetPlayableMapRect())
loop
set u6=FirstOfGroup(herounits)
exitwhen u6==null
call GroupRemoveUnit(herounits,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitType(u6, UNIT_TYPE_HERO) == true ) then
call TriggerRegisterUnitEvent(heroadded, u6, EVENT_UNIT_SPELL_EFFECT)
else
endif
endloop
call DestroyGroup (herounits)
call SaveTriggerHandle(udg_Hash,GetHandleId(t11),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t11),21,heroaction)
endif
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t11, u5, u6, heroadded, heroaction, herounits
set t11 = null
set u5 = null
set u6 = null
set heroaction = null
set heroadded = null
set herounits = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function BendingRefresh takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t10, u5, u6, heroadded, heroaction, herounits
local timer t10 = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t10),2)
local unit u6
local trigger heroadded=LoadTriggerHandle(udg_Hash,GetHandleId(t10),20)
local triggeraction heroaction=LoadTriggerActionHandle(udg_Hash,GetHandleId(t10),21)
local group herounits
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
//Если героя нет, то разрушить таймер, чтобы не крутился и не жрал ресурсы.
if (u5 == null) then
call PauseTimer(t10)
call DestroyTimer(t10)
call FlushChildHashtable(udg_Hash,GetHandleId(t10))
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
else
call TriggerRemoveAction(heroadded,heroaction)
call DestroyTrigger(heroadded)
set heroadded=CreateTrigger()
set heroaction = TriggerAddAction(heroadded,function BendingEffect)
set herounits = GetUnitsInRectAll(GetPlayableMapRect())
loop
set u6=FirstOfGroup(herounits)
exitwhen u6==null
call GroupRemoveUnit(herounits,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitType(u6, UNIT_TYPE_HERO) == true ) then
call TriggerRegisterUnitEvent(heroadded, u6, EVENT_UNIT_SPELL_EFFECT)
else
endif
endloop
call DestroyGroup (herounits)
call SaveTriggerHandle(udg_Hash,GetHandleId(t10),20,heroadded)
call SaveTriggerActionHandle(udg_Hash,GetHandleId(t10),21,heroaction)
endif
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t10, u5, u6, heroadded, heroaction, herounits
set t10 = null
set u5 = null
set u6 = null
set heroaction = null
set heroadded = null
set herounits = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function MadBreathParametersChange takes nothing returns nothing
local integer i = 6
local real newcd = GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
//ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ
loop
exitwhen i < 1
set i = i-1
call SetAbilityCD ('A27Q', i, newcd)
call SetAbilityManaCost('A27Q',i,R2I(newcd) * (2 + i))
endloop
//ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ - ЗАКРЫТО.
else
endif
endfunction
function MadBreath takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: p, p2, u5, u6, enemies
local location p
local location p2
local unit u5 = GetTriggerUnit()
local unit u6
local group enemies = CreateGroup()
local real damage = R2I( GetAbilityCD('A27Q',GetUnitAbilityLevelSwapped('A27Q',u5)) * (2 + GetUnitAbilityLevelSwapped('A27Q',u5)) )
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetSpellAbilityId() == 'A27Q' ) then
set p = GetUnitLoc(u5)
set p2 = PolarProjectionBJ(p, 200.00, GetUnitFacing(GetTriggerUnit()))
call AddSpecialEffectTargetUnitBJ( "overhead", u5, "Psychopomp1.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call AddSpecialEffectTargetUnitBJ( "origin", u5, "Psychopomp1.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
set enemies = GetUnitsInRangeOfLocAll(625.00,p2)
//ТАЛАНТ ГЛУБОКОДЫШАЩЕЕ
if ( GetUnitAbilityLevelSwapped('A280', udg_Circle[GetConvertedPlayerId(GetOwningPlayer(u5))]) == 2 ) and (damage < 100) then
set damage = 100
endif
//ТАЛАНТ ГЛУБОКОДЫШАЩЕЕ - ЗАКРЫТО.
//ЦВЕТОТЕГ РАЗМЕРА 14, ОКРАС СМ. ПЕЙНТ
call CreateTextTagUnitBJ( R2S(damage), u5, 0, 14.00, 80.00, 80.00, 80.00, 0 )
call ConditionalTriggerExecute( gg_trg_floatingtext )
//ЦВЕТОТЕГ РАЗМЕРА 14 - ЗАКРЫТО.
loop
//УРОН С ТЕКСТТАГОМ
set u6=FirstOfGroup(enemies)
exitwhen u6==null
call GroupRemoveUnit(enemies,u6)
if ( GetUnitAbilityLevelSwapped('Avul', u6) != 1 ) and ( IsUnitAliveBJ(u6) == true ) and ( IsUnitEnemy(u6,GetOwningPlayer(u5))==true ) then
call UnitDamageTargetBJ( u5, u6, damage, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC )
endif
endloop
call RemoveLocation (p)
call RemoveLocation (p2)
//УРОН С ТЕКСТТАГОМ - ЗАКРЫТО.
else
endif
call DestroyGroup (enemies)
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: p, p2, u5, u6, enemies
set p = null
set p2 = null
set u5 = null
set u6 = null
set enemies = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Всё не привыкну нормально воспринимать координаты.
Если хочешь, перепиши с полным сохранением функциональности без точек - спасибо скажу... Хотя мб и самостоятельно позже справлюсь, тут нетрудно, просто ща мозги спят уже.
Versus6, Мимироны вот. www.hiveworkshop.com/search/5622289/?q=mimiron&t=resource&am...
Это не модели, а скины. Но можно достать модель ребёнка из варкрафтовского MPQ, переименовать ее, переименовать текстуры и пути к ним через Model Editor и MdlVis и использовать независимо.
Если вдруг сам не можешь, то мб я это тебе позже сделаю, но дела там реально максимум минут на 20-30 даже для человека, который не соображает.
На хайве вроде был эффект блейдшторма, можно тупо прикрепить к кому угодно и разрушить по завершению анимации.
Более-менее подойдет, а уж анимки атаки или чего-нить у своего быка проиграешь.
Ничего себе тут веселуха, просто ради интереса вопросы и заметки:
у кого-то на сайте пара посещений в день, у кого-то дофига просмотров на каналах и он так или иначе организовывает конкурсы на деньги, а честь дворянина именно у первого;
если бы он сидел за компом не в трусах, а без трусов, что-то бы поменялось?
сколько карт-то примерно ожидается?
PS Не участвую, просто ради интереса слежу за сабжем.
На всякий случай ликбез для далее читающих: раньше скрина не было.
Ну по скрину типичный варкрафтовский фатал, хз, говорит, память прочитать не может, много какие косяки в триггерах могут такое вызывать, смотри, че там у тебя в кампании такое страшное.
Daniil18, юзаю мемхак, проблем после протекта не замечаю. Правда, пока не последнюю версию мемхака, а что-то куда ближе к первой (первичная основа + отдельные функции из гитхаба и местных тредов).
» WarCraft 3 / Аура критической атаки
Ссылка сейчас умрёт, новая тут будет сегодня
Ред. ClotPh
» WarCraft 3 / Почему фатал?
///////////
» WarCraft 3 / JNGP не запоминает war3map.j, отредактированный через Блокнот?
» WarCraft 3 / Почему фатал?
Вероятно, несуществующая память пытается считаться все-таки из-за неправильного их использования при несуществующей точке.
Короче, инфа не сотка, но три игры подряд с линзой в последнем варианте ее кода по ссылке - фатала во время игры не было (но в прошлой версии он вроде как раз на третьей игре и словился, так что еще не факт, но все-таки...) В общем, за***ло, уже сегодня отдыхать планировалось (так вот отдых и начался... вместо отдыха фатал и снова лезть фиксить), ща еще каточку в хотс сыграю и все, наверное, будет вечером-ночью перезаписано и залито, если что, апну и эту тему, как и тему с Психопомпой (но там-то не так страшно), если никто не сможет помочь - буду дальше экспериментировать самостоятельно.
Что лучше юзать новый мемхак - уже ясно.
» WarCraft 3 / Эфирная Линза
Уже был промежуточный вариант номер 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
» WarCraft 3 / Почему фатал?
А то я тут что-то еще на точку грешу, что неправильно может определяться. Когда писался код, отталкивалось от того, что если спелл без указания цели, то GetSpellTargetLoc() - это точка кастера. Теперь уже сомневаюсь и кажется, что в таком случае точки вообще нет и начинается черт знает что...
В любом случае ведь все эти функции юзались уже в др. местах, а фаталов не вызывали, фатал был до этого только после игр, а не во время, уже новая вчера залитая версия удалена, ща вот Линзу мучаю.
Если что, тема вот прямо связанная
Ред. ClotPh
» WarCraft 3 / Почему фатал?
Ладно, вроде вот
Файл.
Пока переписываю самостоятельно, там все равно ифзенэлсы косые были под завершение кодинга на усталую голову. Короче, вынесу замер дистанции в верхний ифзенэлс и еще выше наличие предмета, если там будет меньше нужного, то все остальное просто не должно будет проверяться и делаться, а при юзании автосборки из спеллбука дистанция по определению 0... так что вроде должно все исправиться.
Но если у кого-то есть комменты, пишите, причина фатала конкретно интересует все равно.
» WarCraft 3 / И снова о GetAbilityCD и многострадальной Психопомпе
Вбрасываю в таком виде, в каком силы есть вбросить и желание после всего кодинга и тестов, см. выше. Если модеры вставят кат, не побив вложенный файл - спасибо.
Ред. Uber
» WarCraft 3 / И снова о GetAbilityCD и многострадальной Психопомпе
Одно радует, что Психопомпа все равно все улучшается, хотя еще ни с одним героем за всю историю существования игры столько мороки не было, ну, пока фатал будет фирменной фичей =), пост-игры он не так уж мешает, но все же лучше бы без него... war3map.j-шка почти та же самая в плане интересующих функций, выкладываю только все последние связанные с Психопомпой функции, ульт вообще переделан.
» WarCraft 3 / Шмотка, добавляющая дальность атаки
» WarCraft 3 / Эфирная Линза
Если хочешь, перепиши с полным сохранением функциональности без точек - спасибо скажу... Хотя мб и самостоятельно позже справлюсь, тут нетрудно, просто ща мозги спят уже.
» WarCraft 3 / Нужна модель? - Вам сюда!
Это не модели, а скины. Но можно достать модель ребёнка из варкрафтовского MPQ, переименовать ее, переименовать текстуры и пути к ним через Model Editor и MdlVis и использовать независимо.
Если вдруг сам не можешь, то мб я это тебе позже сделаю, но дела там реально максимум минут на 20-30 даже для человека, который не соображает.
» WarCraft 3 / команда -switch
» WarCraft 3 / Пжлст ХЕЛП!
Более-менее подойдет, а уж анимки атаки или чего-нить у своего быка проиграешь.
» WarCraft 3 / Конкурс карт WC3 на 50 000 рублей!
» WarCraft 3 / Пжлст ХЕЛП!
» WarCraft 3 / Что за ошибка и как с ней бороться?
Ну по скрину типичный варкрафтовский фатал, хз, говорит, память прочитать не может, много какие косяки в триггерах могут такое вызывать, смотри, че там у тебя в кампании такое страшное.
» WarCraft 3 / Что за ошибка и как с ней бороться?
////////////
Ред. ClotPh
» WarCraft 3 / Иконки на заказ
Можно скопировать адрес изображения или его само и спокойно делать иконку, если это нужно.
» WarCraft 3 / Иконки на заказ
» WarCraft 3 / дальность атаки
По последней ссылке бота лучший ответ для ТСа уже найден.
» Блог им. Nosferoh / Здесь обсуждать модели
» Блог им. Nosferoh / Здесь обсуждать модели
» WarCraft 3 / Иконки на заказ
Нужна иконка гремлина из HoMM 3.5. Вот этого:
Вкрайний самостоятельно потом поставлю Героев и сделаю. Если кто сделает - спс.
Вот эта картинка НЕ очень нравится как вариант для иконки img0.joyreactor.cc/pics/post/full/Heroes-of-might-and-magic-III-... , ее не надо
Больше вообще ничего тут не вижу подходящего yandex.ru/images/search?text=гремлин%20герои%203
Это тоже не очень www.google.ru/search?q=heroes 3 gremlin&newwindow=1&sour...
Это просто противно выглядит s3-eu-west-1.amazonaws.com/elfwood--artwork/9b878ed0-2455-11e4-9...
Ладно, короче, если кто хочет и не трудно и не мутно получится - обрежьте ингейм, если нет - забудьте про это сообщение
» WarCraft 3 / Wc3 Map Optimizer 5.0 Rus