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

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

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Обучение\нанесене урона таймером
Обясните пожалуйста умные люди:
Как правильно с помощью таймера пикать юнитов, условие=>только врагам наносить урон
Пробовал сделать сам но только начинающий и знаний катстрофически не хватает =\
Старый 28.01.2010, 21:45
XOR

offline
Опыт: 38,159
Активность:
TimerStart(0.04, true, function lol)
+ GroupEnumUnitsInRange
+ ForGroup
+ UnitDamageTarget
+ if IsPlayerEnemy then
..
Старый 28.01.2010, 21:51
Doc

offline
Опыт: 63,163
Активность:
Так в чем сложность? В функции вызываемой таймером ставим нужные тебе действия
DoctorGester добавил:
И когда мне нехватало знаний я открывал опендоту по 10 раз на дню и тщательно изучал =/
Старый 28.01.2010, 22:02
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
AlexKARASb, если ты говоришь про приаттачивание данных к таймеру, то поковыряй опен доту, или почитай статью, там такойже принцип как и в кеше
Старый 28.01.2010, 23:56
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Вот код того что я смог сделать
Код:
function Trig_JTKaton_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A001'
endfunction

function JTKTimerMove takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit Dummy = LoadUnitHandle(udg_Hash,i,2)
    local unit t
    local group g
    local real XC = LoadReal(udg_Hash,i,0)
    local real YC = LoadReal(udg_Hash,i,1)
    local real Angle = LoadReal(udg_Hash,i,3)
    local real XN = GetUnitX(Dummy)
    local real YN = GetUnitY(Dummy)
    call SetUnitX(Dummy, XN+20*Cos(Angle))
    call SetUnitY(Dummy,YN+20*Sin(Angle))
    call SaveReal(udg_Hash,i,4,XN)
    call SaveReal(udg_Hash,i,5,YN)
    call GroupEnumUnitsInRange(g,XN,YN,100,???)
    call UnitDamageTarget(Dummy,t,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
    if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000 then
    call KillUnit(Dummy)
    call FlushChildHashtable(udg_Hash, i)
    call PauseTimer(t)
    call DestroyTimer(t)
    set t = null
    endif
    
endfunction

function Trig_JTKaton_Actions takes nothing returns nothing
    local timer t=CreateTimer()
    local unit Caster=GetTriggerUnit()
    local real XC=GetUnitX(Caster)
    local real YC=GetUnitY(Caster)
    local location CastLoc=GetSpellTargetLoc()
    local real XL=GetLocationX(CastLoc)
    local real YL=GetLocationY(CastLoc)
    local real Angle = Atan2(YL-YC,XL-XC)
    local integer i = GetHandleId(t)
    local unit Dummy=CreateUnit(GetOwningPlayer(Caster),'h001',XC,YC,Angle*bj_RADTODEG)
    call RemoveLocation(CastLoc)
    call SetUnitFacing(Dummy,Angle*bj_RADTODEG)
    call SetUnitPathing(Dummy,false)
    call SaveReal(udg_Hash,i,0,XC)
    call SaveReal(udg_Hash,i,1,YC)
    call SaveUnitHandle(udg_Hash,i,2,Dummy)
    call SaveReal(udg_Hash,i,3,Angle)
    call TimerStart(t,.03,true,function JTKTimerMove)
endfunction

//===========================================================================
function InitTrig_JTKaton takes nothing returns nothing
    set gg_trg_JTKaton = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_JTKaton, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_JTKaton, Condition( function Trig_JTKaton_Conditions ) )
    call TriggerAddAction( gg_trg_JTKaton, function Trig_JTKaton_Actions )
endfunction

Поясните кто-то кодом, хоть посмотрю как правильно
P.S. XiMiKs, cjass мне еще рассматривать рано =\, он упрощает написание как я понял, но требует знаний обычного жасса, которых у меня нет :D
Старый 30.01.2010, 00:20
Doc

offline
Опыт: 63,163
Активность:
Мда, нашел здесь только одну ошибку: ты не создаешь группу. А так вроде все нормально
Старый 30.01.2010, 00:30
LostCoast

offline
Опыт: 2,633
Активность:
call GroupEnumUnitsInRange(g,XN,YN,100,???) вместо ??? - null , либо твоё условие для группый(на сколько я помню)
Старый 30.01.2010, 00:31
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
DoctorGester,
local unit t \\ незнаю кому присвоить
local group g \\ незнаю что создать
call GroupEnumUnitsInRange(g,XN,YN,100,???) \\ вот дыра
call UnitDamageTarget(Dummy,t,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
Старый 30.01.2010, 00:32
LostCoast

offline
Опыт: 2,633
Активность:
да точно он не создаёт))


local group g = CreateGroup()

__LostCoast добавил:__
set t = FirstOfGroup(g)

LostCoast добавил:
держи пример:

Код:
local location loc = GetSpellTargetLoc()
    local real X = GetLocationX(loc)
    local real Y = GetLocationY(loc)
    local unit Caster = GetSpellAbilityUnit()
    local integer Level = GetUnitAbilityLevel(Caster, 'A002')
    local group gr = CreateGroup()
    local unit u           
    call RemoveLocation(loc)
    call GroupEnumUnitsInRange (gr, X, Y, 200, null )
    loop
        set u = FirstOfGroup(gr)
        exitwhen u == null
        call UnitDamageTargetBJ( Caster, u, 35*Level, ATTACK_TYPE_MELEE, DAMAGE_TYPE_LIGHTNING )
        call GroupRemoveUnit (gr, u)
    endloop
    call DestroyGroup(gr)     
    call DestroyEffectTime(AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl"    ,X,Y),3)                                                              
    call DestroyEffectTime(AddSpecialEffect("Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl",X,Y),3)
    set gr = null
Старый 30.01.2010, 00:34
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
LostCoast, вместо нул врага как поставить? ENEMY_UNIT?
Старый 30.01.2010, 00:36
Doc

offline
Опыт: 63,163
Активность:
Наносим урон перебирая все в группе г либо форгрупом либо брутфорсом. Тема про брутфорс по соседству, поищи
DoctorGester добавил:
Опоздал слегка. LostCoast молодец:)
Старый 30.01.2010, 00:38
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
тоесть ты создаеш цикл, пикаеш первого из групы, выход когда u нул, нанести ему урон(ATTACK_TYPE_MELEE у это проще чем я накалякал :D), удалить из группы,
затем удалить группу, обнулить затем
вроде понял, спасибо, пойду писать код ;)
Старый 30.01.2010, 00:41
LostCoast

offline
Опыт: 2,633
Активность:
AlexKARASb, вместо нулл, точно не помню можно поставить function Condition(там вроде задаюся условия для юнитов в группе
Старый 30.01.2010, 00:48
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
из стомпа в примере cjass'a нашел в фильтре if IsUnitEnemy(utx, ppx) && GetWidgetLife(utx) > .405
как правильно вставить в мой код не очень понял
Старый 30.01.2010, 00:52
Doc

offline
Опыт: 63,163
Активность:
Это будет работать только с сжассом. Ставь обычный иф перед функцией нанесения урона и условие что выбранный юнит противник.
Старый 30.01.2010, 00:54
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
XiMiKs:
TimerStart(0.04, true, function lol)
+ GroupEnumUnitsInRange
+ ForGroup
+ UnitDamageTarget
+ if IsPlayerEnemy then
..
пример того, как ненадо делать
и это тоже очень плохой пример
Старый 30.01.2010, 00:59
LostCoast

offline
Опыт: 2,633
Активность:
воть


Код:
if (u != Caster) and (IsUnitEnemy(u, p)) and ((GetUnitState(u, UNIT_STATE_LIFE) > 0)) then


LostCoast добавил:
Enein, согласен что плохой)но работает более менее нормально)
Старый 30.01.2010, 01:01
Doc

offline
Опыт: 63,163
Активность:
Enein, у тебя все примеры плохие:) так напиши хороший
Старый 30.01.2010, 01:03
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
но работает более менее медленно
// ща придет деод, и снова начнет рассказывать про байтосчитание)

Отредактировано Enein, 30.01.2010 в 01:10.
Старый 30.01.2010, 01:03
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Код:
call GroupEnumUnitsInRange(gr,XN,YN,300,null)
    loop
        set tr = FirstOfGroup(gr)
        exitwhen tr == null
        if IsUnitEnemy(tr,Player(0)) then
            call UnitDamageTarget(Dummy,tr,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
            call GroupRemoveUnit (gr, tr)
        else
        call GroupRemoveUnit (gr, tr)
        endif
    endloop
    call DestroyGroup(gr)     
    if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000 then
    call KillUnit(Dummy)
    set gr = null
    call FlushChildHashtable(udg_Hash, i)
    call PauseTimer(t)
    call DestroyTimer(t)
    set t = null
    endif
endfunction

получилось только одно меня интересует вместо плеер красный почему триггерплеер не работает?

AlexKARASb добавил:
Enein, раз плохой то где найти хороший =\?
и как тогда делать правильно??
Старый 30.01.2010, 01:06
Закрытая тема

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

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

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

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



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