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

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

Ответ
 
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
в том то и смысл моего способа что не нужны никакие группы к томуже ты не сделаешь с группами так чтобы юнита могло ранить дважды если он снова сунулся под снаряд (хотя нет можно, но тогда добавится еще 1 пик в пике а это не есть гут)
Старый 13.12.2010, 23:51
JassMan
свободен
offline
Опыт: 4,193
Активность:
Вообщето можно, и при пике 1 раз, просто сравнивать кол во срабатываний нанесения урона, ты даже не смотрел как я сделал.
Хотя я думаю вряд ли поймёшь. . .
объясню смысл:
участвуют две группы: 1 постоянная(g) и одна генерирующаяся (gg) при каждом срабатывании таймера.
g — та группа юнитов, которым уже нанесли урон.
при пике в gg (чтобы не путаться нужными, пикаем в gg а не в g) заранее проверяем находится ли юнит в g, и если нет, то наносим урона и заносим в неё чтобы в следующий раз не было урона.

Отредактировано JassMan, 15.12.2010 в 12:43.
Старый 13.12.2010, 23:56
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
пик юнитов в радиусе условие (юнит уже ранен) = нет
а допустим юнит немного отбежал после урона а потом снова телепортировался под стрелу получится что второй раз его не ранит.
В Доте, например, когда Мирана прыгает из-под Звуковой волны акаши, получив от волны урон, после "приземления" её снова догоняет волна и наносит урон второй раз. Как ты определишь что волна снова догнала Мирану и ей снова нужно наносить урон ?
Я это имел в виду.

Отредактировано Zanozus, 14.12.2010 в 00:09.
Старый 14.12.2010, 00:02
JassMan
свободен
offline
Опыт: 4,193
Активность:
Там после n-ного срабатывания таймера (пока снаряд летит) юнит удаляется из группы (g), и его можно снова коцать
Старый 14.12.2010, 01:37
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
выбирай любой
Прикрепленные файлы
Тип файла: w3x fireball.w3x (17.3 Кбайт, 8 просмотров )
Тип файла: w3x fireball_Jass.w3x (18.7 Кбайт, 14 просмотров )
Старый 14.12.2010, 08:03
JassMan
свободен
offline
Опыт: 4,193
Активность:
Master_chan
Во-первых, у тебя юнит улетает за пределы карты, и код работает не очень быстро, поэтому я чутка изменил его.
А, во-вторых, если второй раз запустить (не позже 2-4 сек после первого каста), то юнит не получит урон, ибо на него до сих пор будет действовать первый запуск фаербола.
Если уменьшить длительность горения, то есть вероятность что за полёт, юнит будет ранен 2 раза.
В общем, надо делать урон триггерно! Как я это сделал в одном из предыдущих постов.
Прикрепленные файлы
Тип файла: w3x Fireball.w3x (18.9 Кбайт, 11 просмотров )
Старый 14.12.2010, 23:47
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Изучай(-те).
Используется всего 1 Enum и только для перемещения снаряда ! Можно стрелять как из пулемета.
Осторожно ! VJass ! JNGP !
» Работоспособный код
library missile initializer Init
globals
private constant hashtable HT=InitHashtable()
private group G=CreateGroup()
private constant integer SpellID='A000'
private constant integer DummyID='e000'
endglobals

private function Actions3 takes nothing returns nothing
call GroupRemoveUnit(G,GetTriggerUnit())
endfunction

private function Actions2 takes nothing returns nothing
local unit u=GetEnumUnit()
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local real a=GetUnitFacing(u)
set x=x+CosBJ(a)*15.00
set y=y+SinBJ(a)*15.00
if IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY)==false then
call SetUnitX(u,x)
call SetUnitY(u,y)
else
call KillUnit(u)
endif
set u=null
endfunction

private function Actions1 takes nothing returns nothing
call ForGroup(G,function Actions2)
endfunction

private function Conditions2 takes nothing returns boolean
local unit u=LoadUnitHandle(HT,GetHandleId(GetTriggeringTrigger()),1)
local real h=GetUnitFlyHeight(u)-GetUnitFlyHeight(GetTriggerUnit())
local player p=GetOwningPlayer(u)
if IsUnitEnemy(GetTriggerUnit(),p) and RAbsBJ(h)<100 then
call UnitDamageTarget(u,GetTriggerUnit(),100.00,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_T​YPE_WHOKNOWS)
endif
set u=null
return false
endfunction

private function AngleBetweenCords takes real x1, real y1, real x2, real y2 returns real
local real a
set a = bj_RADTODEG * Atan2(y2-y1,x2-x1)
return a
endfunction

private function Conditions1 takes nothing returns boolean
local unit u
local player p
local real x
local real y
local real h
local real a
local trigger t
if GetSpellAbilityId()==SpellID then
set x=GetUnitX(GetTriggerUnit())
set y=GetUnitY(GetTriggerUnit())
set h=GetUnitFlyHeight(GetTriggerUnit())
set a=AngleBetweenCords(x,y,GetSpellTargetX(),GetSpellTargetY())
set p=GetOwningPlayer(GetTriggerUnit())
set t=CreateTrigger()
set u=CreateUnit(p,DummyID,x,y,a)
call UnitApplyTimedLife(u,'BTLF',2.00)
call FlushChildHashtableBJ(GetHandleId(u),HT)
call FlushChildHashtableBJ(GetHandleId(t),HT)
call SetUnitFlyHeight(u,h,0.00)
call GroupAddUnit(G,u)
call TriggerRegisterUnitInRange(t,u,100.00,null)
call TriggerAddCondition(t,Condition(function Conditions2))
call SaveUnitHandle(HT,GetHandleId(t),1,u)
set u=null
endif
return false
endfunction

private function Init takes nothing returns nothing
local integer i=0
local trigger t1=CreateTrigger()
local trigger t2=CreateTrigger()
local timer t=CreateTimer()
loop
 call TriggerRegisterPlayerUnitEvent(t1,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
 call TriggerRegisterPlayerUnitEvent(t2,Player(i),EVENT_PLAYER_UNIT_DEATH, null)
 set i=i+1
 exitwhen i>11
endloop
call TriggerAddCondition(t1,Condition(function Conditions1))
call TimerStart(t,0.025,true,function Actions1)
call TriggerAddAction(t2,function Actions3)
set t1=null
set t2=null
set t=null
endfunction
endlibrary
Прикрепленные файлы
Тип файла: w3x missile.w3x (19.0 Кбайт, 11 просмотров )

Отредактировано Zanozus, 15.12.2010 в 02:06.
Старый 15.12.2010, 01:40
silumin

offline
Опыт: 11,153
Активность:
Чебурашка, переодически пикай юнитов вокруг дамми, проверяй каждого юнита на наличие оного в группе, если юнит не в группе, то дамаж его и добавляй (не пикай, а добавляй) в группу.
Думаю что-то аналогичное в примере от JassMan.
Старый 15.12.2010, 10:06
JassMan
свободен
offline
Опыт: 4,193
Активность:
Не аналогично, а всё точно, как ты сказал.
Старый 15.12.2010, 12:41
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
silumin, вы читали сообщения выше ? Есть случай когда снаряду НУЖНО ранить врага второй (десятый) раз. (см. выше)
А у вас получается что снаряд ранит врага ТОЛЬКО один раз даже если он сунется под снаряд ВТОРОЙ(десятый) РАЗ.
А номер с таймером может вызвать баги, если враг не покинет область поражения снаряда после окончания таймера. А если поставить таймер на дольшее время, то юнита не ранит если он сунется второй раз раньше чем закончится таймер. Можно, конечно подобрать средний таймер чтобы это было маловероятно. Да и придется создавать таймер для каждого "раненого" а если таких снарядов несколько то придеться вешать еще и несколько таймеров, а это костыли и грабли.

Отредактировано Zanozus, 15.12.2010 в 13:18.
Старый 15.12.2010, 13:05
JassMan
свободен
offline
Опыт: 4,193
Активность:
В любом случае моя система подходит. Просто можно его удалить из группы пока снаряд летит (через определённое кол-во срабатываний таймера)
Старый 15.12.2010, 15:31
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
JassMan, не думаю что ОП'у нужен пулемет из фаерболлов -> триггерный урон = бред. Тем более что это легко меняется в РО (кд у способности "Огонь феникса")
А то что мой код работает "не очень быстро" это я не понял. Из изменений заметил только допиливание исчезновения, а остальное - убрал локалки и дефайны. Выигрыша в производительности не вижу.
Старый 15.12.2010, 17:29
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Так харэ кирпичи из штанов выкидывать (для тех кто намек поймет)
Ждем мнения автора, и затем, скорее всего, закрываемся.
Старый 15.12.2010, 17:33
Ответ

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

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

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

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



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