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

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

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Постановка триггера(Jass), обьяснение на основе способности
так как мои дела в изучении Jass очень тяжело продвигаются я решил посмотреть как делают триггеры опытные люди
взял из Опен доты способность и начал ее изучать
способность - стрела Мираны
вот весь код
» раскрыть
// OpenDota 6.41 deprotected by NETRAT and DioD
// inspired by everyone who posted on forum threads and feedback page
// based on OpenDota 6.32b, deprotected by DimonT, NETRAT and TheBloodiest
// http://dimon.xgm.guru/opendota/
// Visit our modmaking community at http://xgm.guru/

// Objects used:
// 'A0L8' = Elune's Arrow (Priestess of the Moon : Mirana Nightshade)
// 'A04R' = Marker (Nether Ward 4,Lightning Bolter,Nether Ward 3,Nether Ward 2,Vengeance Death caster,...)
// 'e00E' = Spellcaster
// 'A0L7' = Basic Stun
// 'h005' = Elune's Arrow

// DEBUG Trigger Number : 55
function EluneArrowCheck takes nothing returns boolean
return GetSpellAbilityId()=='A0L8'
endfunction

function EluneArrowFilter takes nothing returns boolean
return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(udg_u_DTAX_temp))and GetUnitAbilityLevel(GetFilterUnit(),'A04R')==0 and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>1 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction

function EluneArrowStunCalc takes real pX1,real pY1,real pX2,real pY2 returns integer
local real lDistance=SquareRoot((pX2-pX1)*(pX2-pX1)+(pY2-pY1)*(pY2-pY1))
return ReturnMin(R2I(lDistance/150),10)
endfunction

function EluneArrowTimer takes nothing returns nothing
local timer lMove=GetExpiredTimer()
local string lTable=H2Tx(lMove)
local unit lCaster=GetUnit(lTable,"Hero")
local unit lBolt=GetUnit(lTable,"Projectile")
local real lXL=GetReal(lTable,"TargetX")
local real lYL=GetReal(lTable,"TargetY")
local real lAngle=GetReal(lTable,"Angle")
local real lXX=GetUnitX(lBolt)
local real lYY=GetUnitY(lBolt)
local real lXN=SafeX(GetUnitX(lBolt)+30*Cos(lAngle))
local real lYN=SafeY(GetUnitY(lBolt)+30*Sin(lAngle))
local boolexpr lCheck=Condition(function EluneArrowFilter)
local group lEnumGroup=CreateGroup()
local unit lTemp
local unit lFirst
local real lXF
local real lYF
call SetUnitX(lBolt,lXN)
call SetUnitY(lBolt,lYN)
set udg_u_DTAX_temp=lCaster
call GroupEnumUnitsInRange(lEnumGroup,lXN,lYN,150,lCheck)
set lFirst=FirstOfGroup(lEnumGroup)
call DestroyGroup(lEnumGroup)
call DestroyBoolExpr(lCheck)
if lFirst!=null then
set lXF=GetReal(lTable,"OriginalX")
set lYF=GetReal(lTable,"OriginalY")
set lTemp=CreateUnit(GetOwningPlayer(lCaster),'e00E',lXX,lYY,0)
call UnitAddAbility(lTemp,'A0L7')
call SetUnitAbilityLevel(lTemp,'A0L7',EluneArrowStunCalc(lXF,lYF,lXX,lYY))
call IssueTargetOrderById(lTemp,OrderId("thunderbolt"),lFirst)
call UnitDamageTarget(lCaster,lFirst,90*GetUnitAbilityLevel(lCaster,'A0L8'),true,fals e,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
call KillUnit(lBolt)
call KillTimer(lMove)
elseif(lXN-lXL)*(lXN-lXL)+(lYN-lYL)*(lYN-lYL)<1600 then
call KillUnit(lBolt)
call KillTimer(lMove)
endif
endfunction

function EluneArrowAction takes nothing returns nothing
local unit lCaster=GetTriggerUnit()
local real lXX=SafeX(GetUnitX(lCaster))
local real lYY=SafeY(GetUnitY(lCaster))
local location lCastLoc=GetSpellTargetLoc()
local real lXL=GetLocationX(lCastLoc)
local real lYL=GetLocationY(lCastLoc)
local real lAngle=Atan2(lYL-lYY,lXL-lXX)
local timer lMove=CreateTimer()
local string lTable=H2Tx(lMove)
local unit lBolt=CreateUnit(GetOwningPlayer(lCaster),'h005',lXX,lYY,lAngle*bj_RADTODEG)
call RemoveLocation(lCastLoc)
call SetUnitFacing(lBolt,lAngle*bj_RADTODEG)
call SetUnitPathing(lBolt,false)
set lXL=SafeX(lXX+3000*Cos(lAngle))
set lYL=SafeY(lYY+3000*Sin(lAngle))
call SetReal(lTable,"OriginalX",lXX)
call SetReal(lTable,"OriginalY",lYY)
call SetReal(lTable,"TargetX",lXL)
call SetReal(lTable,"TargetY",lYL)
call SetReal(lTable,"Angle",lAngle)
call SetHandle(lTable,"Hero",lCaster)
call SetHandle(lTable,"Projectile",lBolt)
call TimerStart(lMove,.035,true,function EluneArrowTimer)
endfunction

function HJ takes nothing returns nothing
local trigger ltt=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ltt,Condition(function EluneArrowCheck))
call TriggerAddAction(ltt,function EluneArrowAction)
call SpellPreload('A0L7')
endfunction


function InitTrig_Elune_Arrow takes nothing returns nothing
endfunction
\\\\\\\\\\\\\\\\\\\\\\\\\\

Для начала я рассмотрел весь триггер. Посмотрел из каких частей работает способность и стал рассматривать функции
Попрошу вас ответить на некоторые мои вопросы, которые мне в триггере не понятны:
1)таймер для меня был немного непонятен
а именно эта строка
» раскрыть
local string lTable=H2Tx(lMove)
и последующие к ней
здесь создается что-то вроде временной ячейки запоминающей последующие выражния?
2)искал функцию в триггере, которая удаляет юнита при растоянии 3000 от точки каста спела
» раскрыть
elseif(lXN-lXL)*(lXN-lXL)+(lYN-lYL)*(lYN-lYL)<1600 then
call KillUnit(lBolt)
call KillTimer(lMove)
endif

возможна эта она в таймере? но не очень понял я ее

Надеюсь, что этой темой не нарушил правил, просто хочу разобраться, научиться чему-то на этом примере.
Старый 14.01.2010, 22:33
9thNerZul
forum/warcraft3
offline
Опыт: 4,869
Активность:
Суть в том, что опен дота построена на ретурн баге, что не используется на 1.24с патче, поизучай поподробнее, придётся делать самому.
Старый 14.01.2010, 22:45
XOR

offline
Опыт: 38,159
Активность:
Айсфрог далеко не хороший кодер. Автор, h2i заменилось на GetHandleId, i2h ConvertFogState в 1.24. Подставляй
Старый 14.01.2010, 22:47
DioD

offline
Опыт: 45,134
Активность:
на 124 это не работает
Старый 14.01.2010, 22:51
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
9thNerZul, ну если ты внимательно читал мой пост и не так его понял то => перефразирую
мне не нужна эта способность, я не собираюсь делать ее, я для изучения взял как пример
*здесь узнал я как выставлять угол правильно(>.< до этого криво было)
*узнал что все функции можно хранить в одном триггере(до этого похожую вещь с движением дамми делал на трех =\)
*охота узнать ответ на 1 вопрос
Старый 14.01.2010, 22:51
9thNerZul
forum/warcraft3
offline
Опыт: 4,869
Активность:
Просто создаётс ядополнительная реальная, которая увеличивается каждый раз на то сколько она пролетела, за опред время если она >3000 то остановить удалить и тд
Старый 14.01.2010, 23:07
DioD

offline
Опыт: 45,134
Активность:
ты возьми и найди текст функции H2Tx
Старый 14.01.2010, 23:08
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
XiMiKs, слевав такую карту его нельзя назвать и плохим ;) (а других я не знаю если честно, + это один из лучших спелов в доте для меня)
1) к первому моему вопросу:
вот обьясните почему он при функции сдвинуть юнита в таймере не использует лок. переменные из действия, а создает дополнительные? (это главное что волнует меня)
+ правильно то как? (не в смысле как двигать юнита -.-, а использовать какие лок. пер.)
2) неважно что на 1.24 не работает, для меня главное узнать построение(алгоритм, план)
Старый 14.01.2010, 23:10
DioD

offline
Опыт: 45,134
Активность:
алгоритм предельно прост, имена функций любезно восстановлены
изучай хоть заизучайся.
Старый 14.01.2010, 23:14
9thNerZul
forum/warcraft3
offline
Опыт: 4,869
Активность:
сек.... Алгоритм движения всё прекрасно описано русским языком)
Старый 14.01.2010, 23:17
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
1)таймер для меня был немного непонятен
а именно эта строка
» раскрыть
local string lTable=H2Tx(lMove)
и последующие к ней
здесь создается что-то вроде временной ячейки запоминающей последующие выражния?
Нет. Эта строка была нужна, чтобы сохранить в таймере стрелу. (Или ещё что-то в чём-то, я весь код не видел.)
Старый 14.01.2010, 23:26
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
avatarDr, эм я написал: ячейки запоминающей последующие выражния?
и ты мне в ответ: чтобы сохранить в таймере стрелу.
запомнить\сохранить очень разные вещи?
последующие выражения эт я хотел сказать последующие функции идущие за строкой =\
на 1 вопрос ответ значит получил(значит такой аналог хеш таблицы был когда-то?)
+ avatarDr, я же кинул код
Старый 14.01.2010, 23:34
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
AlexKARASb, мне лень его смотреть. Не функции, а значения в этой же функции. Это было нечто вроде кустарного GetHandleId().
Старый 14.01.2010, 23:42
Doc

offline
Опыт: 63,163
Активность:
Это нечто вроде рб, для тех кто не в курсе
Старый 14.01.2010, 23:58
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
на вопрос никто не ответил жаль, ладно перефразирую и выделю может не заметили
в общем:
*в действиях я пишу лок. реал Х и Y у юнита
*если я в таймере запишу двигать юнита основываясь именно не этих переменных а не как здесь будет ли правильно так делать?
(не обьяснили зачем он создавал дополнительные а потом их приравнивал)
» раскрыть

function testTimer takes nothing returns nothing
local timer lMove=GetExpiredTimer()
call SetUnitX(Dummy,XX+30*Cos(Angle))
call SetUnitY(Dummy,YY+30*Sin(Angle))

function testAction takes nothing returns nothing
local unit Caster=GetTriggerUnit()
local real XX=SafeX(GetUnitX(Caster))
local real YY=SafeY(GetUnitY(Caster))
local location CastLoc=GetSpellTargetLoc()
local real XL=GetLocationX(CastLoc)
local real YL=GetLocationY(CastLoc)
local real Angle=Atan2(YL-YY,XL-XX)
local timer Move=CreateTimer()
local unit Dummy=CreateUnit(GetOwningPlayer(Caster),'h005',XX,YY,lAngle*bj_RADTODEG)
call RemoveLocation(lCastLoc)
call SetUnitFacing(Bolt,Angle*bj_RADTODEG)
call SetUnitPathing(Bolt,false)
call TimerStart(Move,.035,true,function testTimer)
endfunction

*почему здесь по окончанию работы триггера лок. пер не обнуляются, а просто kill unit(не ремув почему-то)?
*почему при указании угла он умножает на bj_RADTODEG, а не на bj_DEGRODAT(возможно написал с ошибкой). В чем разница этих bj.
*SetUnitPathing - обьясните что такое пасинг
*call SetUnitFacing - установить юниту куда смотреть?(знаю по другому не мог выразить скудный слов. запас)
Старый 15.01.2010, 08:59
DioD

offline
Опыт: 45,134
Активность:
Наверное одна функция переводить радианы в градусы а другая градусы в радианы, не стоит благодарностей ваш КЕП,
Старый 15.01.2010, 10:34
LostCoast

offline
Опыт: 2,633
Активность:
Цитата:
Сообщение от AlexKARASb
function testTimer takes nothing returns nothing
local timer lMove=GetExpiredTimer()
call SetUnitX(Dummy,XX+30*Cos(Angle))
call SetUnitY(Dummy,YY+30*Sin(Angle))



Если ты серьёзно собираешься так двигать, то я под столом))))))
я так понял что ты не понял суть кеша, Ответь ты действительно собираешься так делать?или ты просто забыл подписать ф-ии сохранить и загрузать локалки?
Старый 15.01.2010, 11:11
FaB0SS

offline
Опыт: 2,504
Активность:
AlexKARASb, то что ты написал работать не будет, потому что локальные переменные доступны только в пределах одной функции!
Переменные XX, Dummy, YY, Angle доступны только в пределах функции testAction
Старый 15.01.2010, 11:14
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
FaB0SS, LostCoast, пример сделал с утра(оч рано + спешил) для получения ответа,
который я получил, FaB0SS, спасибо прояснил кое что

LostCoastпод столом быть не надо, дельнее обьяснить человеку чем насмешки писать
для этого и создавал эту тему

FaB0SSзначит мне надо создавать хеш таблицу
создавать новые лок. переменные координаты, сохранять их туда, приравнивать к тем что я создал в действии? если че не так обьясни по подробнее
Старый 15.01.2010, 14:17
FaB0SS

offline
Опыт: 2,504
Активность:
AlexKARASb,
да, с одной функции в другую переменные лучше всего передавать через хеш таблицу
раньше это делалось через кеш...
Старый 15.01.2010, 14:39
Закрытая тема

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

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

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

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



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