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

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

Закрытая тема
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Помогите настроить дамаг
Не очень знаком с группами,в общем помогите настроить дамаг....
call SetUnitFacingToFaceLocTimed(LoadUnitHandle(udg_Hash,id,1),GetSpellTargetLoc(),0) - специально поставил эту функцию - т.к. она точная

function Trig_flamebarrage_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A06F'
endfunction

function SR_flamebarrage takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function Trig_flamebarrage_Func002A takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local group g = LoadGroupHandle(udg_Hash,id,4)
local unit u = LoadUnitHandle(udg_Hash,id,0)
local unit c = GetEnumUnit()
if (IsUnitEnemy(c,GetOwningPlayer(u))==true and IsUnitInGroup(c,g) == false ) then
call UnitDamageTarget(u,c,10*GetUnitState(u,UNIT_STATE_MAX_LIFE)*0.01+ 3*GetHeroStr(u,true),false,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_CLAW_LIGHT_SLICE)
call GroupAddUnit(g,c)
else
endif
set u = null
set t = null
set c = null
set g = null
endfunction

function Trig_flamebarrage_Actions2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_Hash,id,0)
local unit d = LoadUnitHandle(udg_Hash,id,1)
local real x = LoadReal(udg_Hash,id,2)
local real y = LoadReal(udg_Hash,id,3)
local group g = LoadGroupHandle(udg_Hash,id,4)
local real x1 = GetUnitX(d)
local real y1 = GetUnitY(d)
local real f = GetUnitFacing(d)
local real a = LoadReal(udg_Hash,id,5)
if SR_flamebarrage(x,y,x1,y1) <= 1500 then
call SetUnitX(d,x1-32*Cos(a))
call SetUnitY(d,y1-32*Sin(a))
call GroupEnumUnitsInRange(g,x1,y1,200,null)
call ForGroup(g,function Trig_flamebarrage_Func002A)
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralB​uildingExplosion.mdl",x1,y1))
else
call DestroyTimer(t)
call DestroyGroup(g)
call RemoveUnit(d)
call FlushChildHashtable(udg_Hash,id)
endif
set u = null
set d = null
set t = null
set g = null
endfunction

function Trig_flamebarrage_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real f = GetUnitFacing(u)
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local group g = CreateGroup()
call SaveUnitHandle(udg_Hash,id,0,u)
call SaveUnitHandle(udg_Hash,id,1,CreateUnit(GetOwningPlayer(u),'h00R',x+50*Cos(f*bj_RADTODEG),y+50*Sin(f​*bj_RADTODEG),f))
call SaveGroupHandle(udg_Hash,id,4,g)
call SaveReal(udg_Hash,id,2,x)
call SaveReal(udg_Hash,id,3,y)
call SaveReal(udg_Hash,id,5,Atan2(y-GetSpellTargetY(),x-GetSpellTargetX()))
call SetUnitFacingToFaceLocTimed(LoadUnitHandle(udg_Hash,id,1),GetSpellTargetLoc(),0)
call TimerStart(t,0.03,true,function Trig_flamebarrage_Actions2)
set u = null
set t = null
set g = null
endfunction

//===========================================================================
function InitTrig_flamebarrage takes nothing returns nothing
    set gg_trg_flamebarrage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_flamebarrage, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_flamebarrage, Condition( function Trig_flamebarrage_Conditions ) )
    call TriggerAddAction( gg_trg_flamebarrage, function Trig_flamebarrage_Actions )
endfunction

Отредактировано Vadik29, 09.04.2012 в 23:18.
Старый 09.04.2012, 23:09
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
что не так с дмг то?
Старый 09.04.2012, 23:14
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Sidhe, его нету
Старый 09.04.2012, 23:15
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
создаешь группу при юзе скила
сохраняешь (там же)
загружаешь ее в переодичной функции (по таймеру которая)
пикаешь юнитов вокруг
бьешь первого в группе, либо всех в группе (отдельная функция для всех)
удаляешь группу (в переодичной функции)

код ужасен, читай про оптимизиацию кода чтоле
Старый 09.04.2012, 23:17
Klop
Папа римский
offline
Опыт: 13,006
Активность:
нечего не понял что тебе надо
(IsUnitEnemy(c,GetOwningPlayer(u))==true
зачем true
(IsUnitEnemy(c,GetOwningPlayer(u))
Klop добавил:
делай через FirstOfGroup
((кат
group g = CreateGroup()
unit e = null
loop
set e = FirstOfGroup(g)
exitwhen e == null
...
call GroupRemoveUnit(g,e)
endloop
))
Старый 09.04.2012, 23:18
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Klop, у меня скил этот не наносит урон, вот я и обратился к вам за помощью т.к. сам не очень понимаю эти группы
Старый 09.04.2012, 23:20
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
local group Group = CreateGroup()
...
call GroupEnumUnitsInRange(Group,X,Y,120,null)
loop
set Picked = FirstOfGroup(Group)
exitwhen  Picked == null
if (условие что юнит подходит под цель) then
//здесь действия урона
endif
call GroupRemoveUnit(Group,Picked)
endloop
...
call DestroyGroup(Group)
set Group = null
Заюзай этот шаблон для перебора группы и не придется выгружать для каждого юнита из хт значения(ибо такое юзанье форгруппа навевает на меня уныние=/)
GetSpellTargetLoc()
Создает неудаляемую точку
Старый 09.04.2012, 23:23
Klop
Папа римский
offline
Опыт: 13,006
Активность:
я вообще не пойму зачем там поворот)
если при создании ты указал угол поворота
для правильного угла имеется такая функция
Atan2(y2-y1,x2-x1) сразу значение в радианах
Старый 09.04.2012, 23:26
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Klop, потому что иногда криво летит (уже проверял....) а Atan2 вообще на 180 поврачивает...
-_-
function Trig_flamebarrage_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A06F'
endfunction

function SR_flamebarrage takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function Trig_flamebarrage_Actions2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_Hash,id,0)
local unit d = LoadUnitHandle(udg_Hash,id,1)
local real x = LoadReal(udg_Hash,id,2)
local real y = LoadReal(udg_Hash,id,3)
local group g = LoadGroupHandle(udg_Hash,id,4)
local real x1 = GetUnitX(d)
local real y1 = GetUnitY(d)
local real f = GetUnitFacing(d)
local real a = LoadReal(udg_Hash,id,5)
local unit e = null
if SR_flamebarrage(x,y,x1,y1) <= 1500 then
call SetUnitX(d,x1+32*Cos(a))
call SetUnitY(d,y1+32*Sin(a))
call GroupEnumUnitsInRange(g,x1,y1,180,null)
loop
set e = FirstOfGroup(g)
exitwhen e == null
if (IsUnitEnemy(e,GetOwningPlayer(u)) and IsUnitInGroup(e,g) == false ) then
call UnitDamageTarget(u,e,10*GetUnitState(u,UNIT_STATE_MAX_LIFE)*0.01+3*GetHeroStr(u,true),false,false,AT​TACK_TYPE_MAGIC,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_CLAW_LIGHT_SLICE)
endif
call GroupRemoveUnit(g,e)
endloop
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralB​uildingExplosion.mdl",x1,y1))
else
call DestroyTimer(t)
call DestroyGroup(g)
call RemoveUnit(d)
call FlushChildHashtable(udg_Hash,id)
endif
set u = null
set d = null
set t = null
set g = null
endfunction

function Trig_flamebarrage_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real f = GetUnitFacing(u)
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local group g = CreateGroup()
local real a = Atan2(GetSpellTargetY()-y,GetSpellTargetX()-x)
call SaveUnitHandle(udg_Hash,id,0,u)
call SaveUnitHandle(udg_Hash,id,1,CreateUnit(GetOwningPlayer(u),'h00R',x+50*Cos(f*bj_RADTODEG),y+50*Sin(f​*bj_RADTODEG),f))
call SaveGroupHandle(udg_Hash,id,4,g)
call SaveReal(udg_Hash,id,2,x)
call SaveReal(udg_Hash,id,3,y)
call SaveReal(udg_Hash,id,5,a)
call SetUnitFacing(LoadUnitHandle(udg_Hash,id,1),a*bj_RADTODEG)
call TimerStart(t,0.03,true,function Trig_flamebarrage_Actions2)
set u = null
set t = null
set g = null
endfunction

//===========================================================================
function InitTrig_flamebarrage takes nothing returns nothing
    set gg_trg_flamebarrage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_flamebarrage, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_flamebarrage, Condition( function Trig_flamebarrage_Conditions ) )
    call TriggerAddAction( gg_trg_flamebarrage, function Trig_flamebarrage_Actions )
endfunction

Отредактировано Vadik29, 10.04.2012 в 07:39.
Старый 09.04.2012, 23:39
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Vadik29:
Atan2 вообще на 180 поврачивает...
потому что точки не правильно ставиш
там разница от каста до твоего а не наоборот
Atan2(GetSpellTargetY() - GetUnitY(caster),GetSpellTargetX() - GetUnitX(caster))
и дамаг у тебя не наносится потому что условие если юнита нет в группе но он есть
ты же сделал GroupEnum они занеслись,а ты проверяешь если его нет
Старый 10.04.2012, 01:46
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Klop, то что я сделал вызывает ужасные лаги, дамаг должен наноситься 1 раз (я же ведь сначала наношу урон а потом только добавляю в группу, хотя бы 1 раз дамажить он должен...)
Vadik29 добавил:
Klop, Если убрать условие то что юнит в группе то дамаг будет наноситься каждые 0.3 сек а если оставить его небедт вообще...
Vadik29 добавил:
и если убрать call GroupRemoveUnit(g,e) то создаются ужасные лаги
Старый 10.04.2012, 07:44
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Vadik29:
и если убрать call GroupRemoveUnit(g,e) то создаются ужасные лаги
нельзя убирать бесконечный цикл будет,что не понятного,ты сделал над этим юнитом дейсвия и удалил его с группы
Vadik29:
Klop, Если убрать условие то что юнит в группе то дамаг будет наноситься каждые 0.3 сек а если оставить его небедт вообще...
отслеживай баффом или хешем нанесение,проверка на наличие баффа или спелла,а по окончанию спелла убирай бафф или удаляй спелл
Vadik29:
я же ведь сначала наношу урон а потом только добавляю в группу, хотя бы 1 раз дамажить он должен...)
пик происходит когда ты делаеш
GroupEnum
у тебя уже пикаются юниты и они уже в группе когда делаешь условие то ты перебиваеш пикнутых и ты добавляешь юнита когда он итак там есть
Старый 10.04.2012, 07:58
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Вот огромное спасибо Klop, очень помог

function Trig_flamebarrage_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A06F'
endfunction

function SR_flamebarrage takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function Trig_flamebarrage_Actions2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_Hash,id,0)
local unit d = LoadUnitHandle(udg_Hash,id,1)
local real x = LoadReal(udg_Hash,id,2)
local real y = LoadReal(udg_Hash,id,3)
local group g = LoadGroupHandle(udg_Hash,id,4)
local real x1 = GetUnitX(d)
local real y1 = GetUnitY(d)
local real f = GetUnitFacing(d)
local real a = LoadReal(udg_Hash,id,5)
local unit e = null
if SR_flamebarrage(x,y,x1,y1) <= 1500 then
call SetUnitX(d,x1+32*Cos(a))
call SetUnitY(d,y1+32*Sin(a))
call GroupEnumUnitsInRange(g,x1,y1,180,null)
loop
set e = FirstOfGroup(g)
exitwhen e == null
if (IsUnitEnemy(e,GetOwningPlayer(u)) and e != LoadUnitHandle(udg_Hash,GetHandleId(g),GetHandleId(e))) then
call UnitDamageTarget(u,e,10*GetUnitState(u,UNIT_STATE_MAX_LIFE)*0.01+3*GetHeroStr(u,true),false,false,AT​TACK_TYPE_MAGIC,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_CLAW_LIGHT_SLICE)
call SaveUnitHandle(udg_Hash,GetHandleId(g),GetHandleId(e),e)
endif
call GroupRemoveUnit(g,e)
endloop
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralB​uildingExplosion.mdl",x1,y1))
else
call DestroyTimer(t)
call DestroyGroup(g)
call RemoveUnit(d)
call FlushChildHashtable(udg_Hash,id)
call FlushChildHashtable(udg_Hash,GetHandleId(g))
endif
set u = null
set d = null
set t = null
set g = null
endfunction

function Trig_flamebarrage_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real f = GetUnitFacing(u)
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local group g = CreateGroup()
local real a = Atan2(GetSpellTargetY()-y,GetSpellTargetX()-x)
call SaveUnitHandle(udg_Hash,id,0,u)
call SaveUnitHandle(udg_Hash,id,1,CreateUnit(GetOwningPlayer(u),'h00R',x+50*Cos(f*bj_RADTODEG),y+50*Sin(f​*bj_RADTODEG),f))
call SaveGroupHandle(udg_Hash,id,4,g)
call SaveReal(udg_Hash,id,2,x)
call SaveReal(udg_Hash,id,3,y)
call SaveReal(udg_Hash,id,5,a)
call SetUnitFacing(LoadUnitHandle(udg_Hash,id,1),a*bj_RADTODEG)
call TimerStart(t,0.03,true,function Trig_flamebarrage_Actions2)
set u = null
set t = null
set g = null
endfunction

//===========================================================================
function InitTrig_flamebarrage takes nothing returns nothing
    set gg_trg_flamebarrage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_flamebarrage, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_flamebarrage, Condition( function Trig_flamebarrage_Conditions ) )
    call TriggerAddAction( gg_trg_flamebarrage, function Trig_flamebarrage_Actions )
endfunction
Старый 10.04.2012, 08:11
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Vadik29, ещё бы оптимизировать каждый раз вызывать GetHandleId(g) незачем записать в переменную перед циклом желательно
да и последовательность странная
сперва удалил группу а потом вызываеш очистку не записанный хендл
call FlushChildHashtable(udg_Hash,GetHandleId(g))
Старый 10.04.2012, 08:29
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Klop, да это я знаю на спех утром просто писал)
Старый 10.04.2012, 15:33
Закрытая тема

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

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

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

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



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