Добавлен imperfect
function moveAndDamage takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h_id = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_hash, h_id, StringHash("caster"))
local unit dummy = LoadUnitHandle(udg_hash, h_id, StringHash("dummy"))
local integer counter = LoadInteger(udg_hash, h_id, StringHash("counter"))
local real angle = LoadReal(udg_hash, h_id, StringHash("angle"))
local real distance = LoadReal(udg_hash, h_id, StringHash("distance"))
local integer duration_in_count = LoadInteger(udg_hash, h_id, StringHash("duration_in_count"))
local real new_x = GetUnitX(caster) + distance * Cos(angle * bj_DEGTORAD)
local real new_y = GetUnitY(caster) + distance * Sin(angle * bj_DEGTORAD)
local group g_group = LoadGroupHandle(udg_hash, h_id, StringHash("g_group"))
local unit d_unit
if (counter > 0 and GetUnitState(caster, UNIT_STATE_LIFE) > 0.00) then
if (counter > duration_in_count - 50) then
call SaveReal(udg_hash, h_id, StringHash("distance"), distance + 7.00)
elseif (counter < 50) then
call SaveReal(udg_hash, h_id, StringHash("distance"), distance - 7.00)
endif
call SaveReal(udg_hash, h_id, StringHash("angle"), angle - 3.00)
call SetUnitPosition(dummy, new_x, new_y)
call SaveInteger(udg_hash, h_id, StringHash("counter"), counter - 1)
call GroupEnumUnitsInRange(udg_l_group, new_x, new_y, 75.00, null)
// ********************************************************************************
loop
set d_unit = FirstOfGroup(udg_l_group)
if ( not IsUnitInGroup(d_unit, g_group) and d_unit != null) then
call DisplayTextToPlayer(Player(0), 0.00, 0.00, "БАЦ")
call GroupRemoveUnit(udg_l_group, d_unit)
call GroupAddUnit(g_group, d_unit)
endif
exitwhen d_unit == null
endloop
// ********************************************************************************
call SaveGroupHandle(udg_hash, h_id, StringHash("g_group"), g_group)
else
call RemoveUnit(dummy)
call DestroyTimer(t)
call FlushChildHashtable(udg_hash, h_id)
endif
set t = null
set caster = null
set dummy = null
call DestroyGroup(g_group)
set g_group = null
set d_unit = null
call GroupClear(udg_l_group)
endfunction
function AstralniiStraj takes nothing returns nothing
local real duration = 15.00
local real period = 0.03
local integer counter = R2I(duration / period)
local timer t
local unit dummy
local unit caster
local integer h_id
if (GetSpellAbilityId() == 'A001') then
set caster = GetSpellAbilityUnit()
set dummy = CreateUnit(GetOwningPlayer(caster), 'h001', GetUnitX(caster), GetUnitY(caster), 0.00)
set t = CreateTimer()
set h_id = GetHandleId(t)
call SaveUnitHandle(udg_hash, h_id, StringHash("caster"), caster)
call SaveUnitHandle(udg_hash, h_id, StringHash("dummy"), dummy)
call SaveInteger(udg_hash, h_id, StringHash("counter"), counter)
call SaveReal(udg_hash, h_id, StringHash("angle"), 360.00)
call SaveReal(udg_hash, h_id, StringHash("distance"), 0.00)
call SaveInteger(udg_hash, h_id, StringHash("duration_in_count"), counter)
call SaveGroupHandle(udg_hash, h_id, StringHash("g_group"), CreateGroup())
call TimerStart(t, period, true, function moveAndDamage)
set caster = null
set dummy = null
set t = null
endif
endfunction
// *** trigger initialization ***
function InitTrig_AstralniiStraj takes nothing returns nothing
local integer i = 0
set gg_trg_AstralniiStraj = CreateTrigger()
loop
exitwhen i > GetPlayers()
call TriggerRegisterPlayerUnitEvent(gg_trg_AstralniiStraj, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set i = i + 1
endloop
call TriggerAddCondition(gg_trg_AstralniiStraj, Condition(function AstralniiStraj))
endfunction
В цикле который я пометил комментарием вместо call DisplayTextToPlayer(Player(0), 0.00, 0.00, "БАЦ") будет наноситься урон, за всё время действия спелла каждому юниту попавшему под раздачу урон должен нанестись 1 раз, после чего он добавится в группу, и в сле. раз проверку не пройдёт. Проблема в том что "БАЦ" должно написаться всего 1 раз (при выборе самого героя, даммик имеет способность москиты), но по какой то непонятной причине происходит спам "бац", и такое чувство что не каждое истечение таймера (0.03), а даже каждую итерацию цикла. Помогите разобраться. Условие уже как только не крутил...
Принятый ответ
nvc123,
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
во вторых код ужасен
ибо если спел муи то таймер+хэш не лучшее решение
а если не муи то нафиг вообще хэш
короче вот моя старая волна силы
смотри как сделано там и делай также
или просто скопируй её и поменяй
для работы нужны библиотеки cj_types.j и List.j
я их тоже кидаю
закинь их в папку \AdicHelper\lib\ в папке jngp
у меня подобным образом сделаны почти все спелы моей карте и всё ок. Если бы ты сделал карты, в которые хоть кто-то играет, то тебя можно было бы ещё слушать, а так. В доте тоже вон всё на хэше и триггерах и всё ок. Ещё и cjass предлагаешь.
Отредактирован nvc123
на фоне таких как ты можно легко найти работу
16GB, ещё 1 фапающий на доту
если у вас всё нормально работает то сидите тихо у себя и пишите говнокод
нафиг задавать вопросы если всё нормально?
нафиг вообще заходить на сайт если ты про и работаешь под вар3 по статьям 2003 года
а все кто говорят что сейчас 2016 год и можно сделать проще и быстрее это нубы
кстати в оффтопке как раз сейчас обсуждается нечто подобное
Отредактирован 16GB
смысл в том что, надо делать карты, а не фапать на качество кода, иначе ты не хера не сделаешь, ты собственно пример этого.
Мне не нравится, когда людей наставляют на неверный путь.
Да и чем мой способ плох? Иди тести скорость и делай выкладки, или не кукарекай.