XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
WhyNotMe

offline
Опыт: 182
Активность:
Стак триггерного регена
Вот триггерная аура регена (стандартная не подходит - 1%/сек минимум):
Как сделать так, чтобы при нахождении рядом нескольких "Паладинов" ауры не складывались и не давали дикий реген. Нужно чтобы работала аура максимального уровня.
Старый 05.02.2013, 12:25
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
ну так это триггер срабатывает уйму колличество раз
а если их несколько(героев) то от каждого и идет выбор и от каждого паладина бонус капает на всех кто находится в области.
такое лучше писать на jass/
а вообще тебе надо лучше взять спелбук за основу чтоб ауры не складывались и уже триггерно проверять
Старый 05.02.2013, 13:19
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
WhyNotMe, Нужно проверять цель на наличие её в другой группе, кстати лучьге искать цель по баффу...
И если юнит уже имеется в гурпе хилящихся от паладина то не делать ничего
Старый 05.02.2013, 13:20
WhyNotMe

offline
Опыт: 182
Активность:
Попробовал через группы:
Не работает, реген по прежнему складывается. Предположительно из за того, что юниты пикаются одновременно и не успевают добавиться в группу перед новой проверкой.
Через бафы то же самое будет, ведь нельзя определить уровень бафа на юните.
Старый 05.02.2013, 13:55
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
WhyNotMe, Щяс скину вариант на vjass, там будут работать только одна аура с наибольшем уровнем....
quq_CCCP добавил:
WhyNotMe, вот код, скопируй в кастом код карты и настрой как указано:
» Код
((код jass
library DegenAura initializer InitAuraData
НАСТРОЙКИ В БЛОКЕ "difine"
define
{
AuraId = 'A000' Равкод самой ауры.
AuraBuffId = 'B000' Равкод баффа ауры.
AuraRadius = 750.00 Радиус ауры.
AuraHeal = 0.015 Процент лечения умоножается на уровень скилаа.
}

=============================================================================================
Далее вмешательство не рекомендуется!
=============================================================================================
globals
group gg_grp_TempGroup
hashtable gg_htb_GameData
boolexpr gg_bxp_TempBoolexpr
trigger gg_trg_LernDegenAura
Вспомогательные переменные.
timer bj_groupTempTimer
unit bj_lastFilterUnit
real bj_groupLifeFactor = 0.015
integer bj_groupAbilutyLevel = 0
endglobals
private function Check_Unit_Conditions takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return IsUnitAlly( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.00 and GetUnitAbilityLevel( bj_lastFilterUnit, AuraBuffId ) > 0
endfunction
private function AuraBuffDuration takes nothing returns nothing
set bj_groupTempTimer = GetExpiredTimer( )
set bj_groupAbilutyLevel = GetHandleId( bj_groupTempTimer )
call FlushChildHashtable( gg_htb_GameData, GetHandleId( LoadUnitHandle( gg_htb_GameData, bj_groupAbilutyLevel, 0 ) ) )
call DestroyTimer( bj_groupTempTimer )
call FlushChildHashtable( gg_htb_GameData, bj_groupAbilutyLevel )
endfunction
private function LernDegenAura_Conditions takes nothing returns boolean
return GetLearnedSkill( ) == AuraId
endfunction
private function HealAllyUnitEnum takes nothing returns nothing
local unit targ = GetEnumUnit( )
local integer id = GetHandleId( targ )
local unit PrevHero = LoadUnitHandle( gg_htb_GameData, id, 0 )
local integer PrevLevel = LoadInteger( gg_htb_GameData, id, 1 )
if PrevHero == null then
set bj_groupTempTimer = CreateTimer( )
call SaveUnitHandle( gg_htb_GameData, id, 0, bj_lastFilterUnit )
call SaveInteger( gg_htb_GameData, id, 1, bj_groupAbilutyLevel )
call SaveUnitHandle( gg_htb_GameData, GetHandleId( bj_groupTempTimer ), 0, targ )
call TimerStart( bj_groupTempTimer, 2.10, false, function AuraBuffDuration )
elseif PrevHero == bj_lastFilterUnit and PrevLevel <= bj_groupAbilutyLevel then
set bj_groupTempTimer = CreateTimer( )
call SaveUnitHandle( gg_htb_GameData, id, 0, bj_lastFilterUnit )
call SaveInteger( gg_htb_GameData, id, 1, bj_groupAbilutyLevel )
call SaveUnitHandle( gg_htb_GameData, GetHandleId( bj_groupTempTimer ), 0, targ )
call TimerStart( bj_groupTempTimer, 2.10, false, function AuraBuffDuration )
call SetUnitState( targ, UNIT_STATE_LIFE, GetUnitState( targ, UNIT_STATE_LIFE ) + GetUnitState( targ, UNIT_STATE_LIFE ) * bj_groupLifeFactor )
elseif PrevHero != bj_lastFilterUnit and PrevLevel < bj_groupAbilutyLevel then
set bj_groupTempTimer = CreateTimer( )
call SaveUnitHandle( gg_htb_GameData, id, 0, bj_lastFilterUnit )
call SaveInteger( gg_htb_GameData, id, 1, bj_groupAbilutyLevel )
call SaveUnitHandle( gg_htb_GameData, GetHandleId( bj_groupTempTimer ), 0, targ )
call TimerStart( bj_groupTempTimer, 2.10, false, function AuraBuffDuration )
call SetUnitState( targ, UNIT_STATE_LIFE, GetUnitState( targ, UNIT_STATE_LIFE ) + GetUnitState( targ, UNIT_STATE_LIFE ) * bj_groupLifeFactor )
endif
set targ = null
endfunction
private function DegenAura takes nothing returns nothing
local timer t = GetExpiredTimer( )
local integer id = GetHandleId( t )
local unit hero = LoadUnitHandle( gg_htb_GameData, id, StringHash( "Hero" ) )
set bj_groupEnumOwningPlayer = GetOwningPlayer( hero )
call GroupClear( gg_grp_TempGroup )
call GroupEnumUnitsInRange( gg_grp_TempGroup, GetUnitX( hero ), GetUnitY( hero ), AuraBuffId, gg_bxp_TempBoolexpr )
set bj_lastFilterUnit = hero
set bj_groupAbilutyLevel = LoadInteger( gg_htb_GameData, id, StringHash( "AuraLevel" ) )
set bj_groupLifeFactor = AuraHeal * bj_groupAbilutyLevel
call ForGroup( gg_grp_TempGroup, function HealAllyUnitEnum )
set hero = null
set t = null
endfunction
private function LernDegenAura_Actions takes nothing returns nothing
local unit hero = GetTriggerUnit( )
local integer level = GetUnitAbilityLevel( hero, AuraId )
local timer t
local integer id
if level != 1 then
set t = CreateTimer( )
set id = GetHandleId( t )
call SaveTimerHandle( gg_htb_GameData, GetHandleId( hero ), 0, t )
call SaveUnitHandle( gg_htb_GameData, id, StringHash( "Hero" ), hero )
call SaveInteger( gg_htb_GameData, id, StringHash( "AuraLevel" ), level )
call TimerStart( t, 1.00, true, function DegenAura )
else
set t = LoadTimerHandle( gg_htb_GameData, GetHandleId( hero ), 0 )
call SaveInteger( gg_htb_GameData, GetHandleId( t ), StringHash( "AuraLevel" ), level )
endif
set hero = null
set t = null
endfunction
private function InitAuraData takes nothing returns nothing
local integer nIndex = 0
set gg_grp_TempGroup = CreateGroup( )
set gg_htb_GameData = InitHashtable( )
set gg_bxp_TempBoolexpr = Condition( function Check_Unit_Conditions )
set gg_trg_LernDegenAura = CreateTrigger( )
loop
exitwhen nIndex > bj_MAX_PLAYERS
call TriggerRegisterPlayerUnitEvent( gg_trg_LernDegenAura, Player( nIndex ), EVENT_PLAYER_HERO_SKILL, null )
set nIndex = nIndex + 1
endloop
call TriggerAddCondition( gg_trg_LernDegenAura, Condition( function Check_Unit_Conditions ) )
call TriggerAddAction( gg_trg_LernDegenAura, function LernDegenAura_Actions )
endfunction

))

Отредактировано quq_CCCP, 05.02.2013 в 14:49.
Старый 05.02.2013, 14:43
WhyNotMe

offline
Опыт: 182
Активность:
Формула 0,15%+0,03%*лвл скила
Старый 05.02.2013, 14:53
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
WhyNotMe, щя поправлю, но ты себе скопипасти и проверь, я не тестил, только готовое переписал, не проверяя в игре, но проверил на синтаксические ошибки, так что пробуем...
Старый 05.02.2013, 14:56
WhyNotMe

offline
Опыт: 182
Активность:
Как создать этот кастом код карты? На джассе никогда раньше ничего не делал.
Апд:вроде нашёл, щас попробую.
Апд2:в обычном редакторе после скрипта появляется 1,4к+ ошибок и карта не запускается.
в только что скаченном JNGP5 компиляция проходит успешно, но карта всё равно не запускается.
WhyNotMe добавил:
Непонятно каким образом, но после этого сломалась дота (она совместилась с моей картой). При заходе в игру она снова скачивается, а старая превратилась вот во что:
Статы героев и отображение урона появились из моей карты.

Отредактировано WhyNotMe, 05.02.2013 в 15:25.
Старый 05.02.2013, 16:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
WhyNotMe:
Такс, путь к карте должен быть без рус символов как и имя карте только английскими буквами...
Старый 05.02.2013, 16:09
WhyNotMe

offline
Опыт: 182
Активность:
Имя карты и путь на английском : d:\Games\Warcraft\maps\worldedit\ArenaRPGland.w3x
Старый 05.02.2013, 16:15
Raised
Rid-Aid-Ios
offline
Опыт: 20,792
Активность:
Создаешь один триггер с событием "Периодическое событие" с шагом 0.1 секунды (для нормального вида регена), соответственно изменяешь алгоритм. Понадобится аура-пустышка (для вешания бафа). Далее выделяешь всех героев со способностью, а затем всех, на кого действует аура. После увеличиваешь его хп на алгоритм*самый большой уровень способности у героя в соответствующем радиусе.

Отредактировано RiseD_Konst, 06.02.2013 в 20:39.
Старый 05.02.2013, 18:34
WhyNotMe

offline
Опыт: 182
Активность:
Сделал так, вроде работает: gyazo.com/2a9bd37368ada20aaa7f8573e27fd48f.png
Но всё ещё интересно что стало с дотой. Если надо, могу выложить "сломанную" доту.
апд: оказалось дота сломалась из за файла war3map.j в корне игры, который остался после джасса.

Отредактировано WhyNotMe, 05.02.2013 в 21:37.
Старый 05.02.2013, 20:03
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
RiseD_Konst, дурной чтоли, 1 сек хватит за глаза, куда ему регенить 10 раз в сек...
Старый 06.02.2013, 05:01
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
quq_CCCP:
куда ему регенить 10 раз в сек
чтобы число красиво менялось в динамике, очевидно же.
Старый 06.02.2013, 11:04
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
Clamp, ну стандартное же не меняется, правдо работает в разнобой, на какждый типо сам таймер...
кстати 10 раз для плавности все равно много, 3-4 раза в сек. смотрится плавнее некуда, учитывая кол-во хп.
Старый 06.02.2013, 13:53
Raised
Rid-Aid-Ios
offline
Опыт: 20,792
Активность:
quq_CCCP, тренируй зрение и будешь замечать, что не все так плавно, как хочется
кстати 10 раз для плавности все равно много, 3-4 раза в сек. смотрится плавнее некуда, учитывая кол-во хп.
Неужто это краш вызовет?)
Старый 06.02.2013, 21:00
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Ничего это не вызовет, он опять пёрнул в лужу просто для факта.
я делаю такие вещи 25 раз в секунду и очень классно выглядит. Особенно если это урон, от которого можно убежать - тогда это ещё и вносит некую "честность": когда убежал от него, тогда он и прекратился, а не считать тики.
Старый 06.02.2013, 21:35
Extremator

offline
Опыт: 39,681
Активность:
я бы сделал так...
...типа триггерная аура
  • периодически проверять наличие юнитов без баффа около каждого паладина с аурой
    • при обнаружении такого юнита, давать ему баф и некий числовой показатель (реген) + заносить в некий список
  • периодически проверять всех юнитов из списка, проверять всех юнитов вокруг на наличии среди них паладинов с аурами...
    • при обнаружении таких паладинов устанавливать числовой показатель на нужное значение...
      • при переборе паладинов ставить наивысший из возможных вариантов бонуса регенеа
    • если не будет найдено паладинов - убрать баф, вычеркнуть из списка
Старый 06.02.2013, 21:46
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,494
Активность:
RiseD_Konst:
quq_CCCP, тренируй зрение и будешь замечать, что не все так плавно, как хочется
кстати 10 раз для плавности все равно много, 3-4 раза в сек. смотрится плавнее некуда, учитывая кол-во хп.
Неужто это краш вызовет?)
Конечно нет, но и никакого красивого эффекта небудет с такой частотой, особенно с 25 в сек Clamp,...
Толку ровно 0, можно убежать от урона и получить 1 хп, ой как хорошо, процент регена то видели 0.0015 + 0.003 хп от максимума, там хп 4 регенит, так это нужно эти 4 ед. растягивать на 25 мини хилов, конечно другое дело есди у вас как в петрах, миллионы хп и миллиарды атаки...
Старый 07.02.2013, 05:32
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Пусть у меня будет щёлкать по миллиметру полоски в секунду, чем плавно убывать постоянно, отличный выбор! А ещё ты трёхмерные игрушки не любишь, слишком там всё плавно, так?))
Старый 07.02.2013, 13:37
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 10:31.