PiCkUpEr_AsT
offline
Опыт:
1,060Активность: |
не пойму почему не работает спелл
Код:
Описание: Восстанавливает 4хРазум ед здоровья союзникам находящимся в радиусе 400 от выбранной цели, может исцелить до 6 персонажей. Приоритет отдается героям. *** Лечит только одну цель.... |
09.07.2011, 10:37 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Где отладочные сообщения? |
09.07.2011, 18:41 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Helpmeplz
offline
Опыт:
11,738Активность: |
вы используете в фильтре GetTriggerUnit()
в комментариях к одной из работ последнего спел контеста на хайве судья написал: Цитата:
сколько видел на xgm все делают иначе. |
|
09.07.2011, 19:04 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
PiCkUpEr_AsT
offline
Опыт:
1,060Активность: |
Цитата:
не имею понятия о чем вы) Цитата:
имеется ввиду не надо писать Код:
исправил "триггер юнит" на загрузку хэндла с таймера, но теперь если тыкаю на героя, лечится указанный герой и обычный воин, а если тыкну на воина, то лечится только воин, вот исправленный код: Код:
|
|||
09.07.2011, 21:07 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Helpmeplz
offline
Опыт:
11,738Активность: |
откуда таймер в фильтре группы?
кроме GetFilterUnit() ты не можешь использовать никаких юнитов используй глобальную переменную |
09.07.2011, 21:24 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
PiCkUpEr_AsT
offline
Опыт:
1,060Активность: |
Цитата:
а почему тогда этоn cпелл работает на ура? Код:
Цитата:
на сколько я понял из теории, локалки лучше глобалок, т.к. есть маленькая вероятность в глобалку записаться непонятно какой величине из n-кол-ва запущенных одного и того же триггера, например 10 исцеляющих заклинаний, запущенных в один и тот же момент с точностью до миллионных долей секунд, к примеру. |
||
09.07.2011, 22:00 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
объявление глобальных переменных внутри триггера.
вроде бы, действуют только в нём, как и ф-ии (или везде, если объявлены в разделе описаний), но на совпадающие названия начинает ругаться. ((код
globals
integer i player p endglobals function test takes integer a, real b returns nothing
a += i cJass. Равносильно: set a = a + i )) Делаешь 2 фильтра: 1 только на героев, 1 только на не-героев.
Затем подставляешь фильтр в 1 в группу все в области и берёшь 6 любых юниттов из получивышейся группы. Хилишь каждого. Измеряешь кол-во юнитов в группе. (i) ((код
if i < 6 then
подставляешь фильтр 2 из получившейся группы берёшь 6-i юнитов и хилишь их. endif )) а вот твой код оставил шокирующее впечатление. ЧИТАТЬ НЕВОЗМОЖНО!
(HII) - ты чего в скобки берёшь? call, local, call ... переходи на cJass, там ето писать не надо Xmin(GetUnitX(u)) - ты вообще дружишь с мозгами? GetUnitX возвращает ОДНО ЗНАЧЕНИЕ real, а ты берёшь и ищешь среди него минимальное (или я не понял действия той ф-ии, ибо её нет в этом триге, мог бы хоть описать её в 2х словах. ((код
local location AC2 = GetSpellTargetLoc()
local real X2I = GetLocationX(AC2) local real X3I = GetLocationY(AC2) )) Ты список ф-ий читал? GetSpellTargetX()//GetSpellTargetY() переменные можно было назвать и понятным языком (location loc, real x, real y,...) ((код
local unit locust = CreateUnit(GetOwningPlayer(u), 'h00Q', X1I, XOI, Q4O * bj_RADTODEG)
... call SetUnitFacing(locust, Q4O * bj_RADTODEG) )) зачем его ещё раз поворачивать??? посмотрел на фильтр
» Filter
((код
function Trig_heal_hero takes nothing returns boolean unit u = GetFilterUnit() if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then return false elseif IsUnitType(u, UNIT_TYPE_STRUCTURE) return false elseif IsUnitType(u, UNIT_TYPE_MECHANICAL) return false elseif GetWidgetLife(u) < 0.405 return false elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE) return false elseif not(IsUnitType(u, UNIT_TYPE_HERO)) return false endif return true endfunction )) он же нечитаем! Все условия записаны в единую строчку! (в отличае от вертикального)
пытался понять код и пройтись по нему, но ето у мя не получилось всязи с вышеупомянотыми причинами.
Лана, хватит издеваться.
» Разверни меня!
((код
define msg(s) = DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, s)
)) ((код
globals
integer a integer i endglobals )) ((код
function Trig_heal_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'Heal' then return true endif return false endfunction )) ((код
function Trig_heal_hero takes nothing returns boolean
unit u = GetFilterUnit() if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then u = null return false elseif IsUnitType(u, UNIT_TYPE_STRUCTURE) u = null return false elseif IsUnitType(u, UNIT_TYPE_MECHANICAL) u = null return false elseif GetWidgetLife(u) < 0.405 u = null return false elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE) u = null return false elseif not(IsUnitType(u, UNIT_TYPE_HERO)) u = null return false endif u = null return true endfunction )) ((код
function Trig_heal_nothero takes nothing returns boolean
unit u = GetFilterUnit() if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then u = null return false elseif IsUnitType(u, UNIT_TYPE_STRUCTURE) u = null return false elseif IsUnitType(u, UNIT_TYPE_MECHANICAL) u = null return false elseif GetWidgetLife(u) < 0.405 u = null return false elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE) u = null return false elseif IsUnitType(u, UNIT_TYPE_HERO) u = null return false endif u = null return true endfunction )) ((код
function Trig_heal_heal takes nothing returns nothing
if i > 0 then i-- UnitDamageTarget(GetSpellAbilityUnit(), GetEnumUnit(), -4.00 * GetHeroInt(GetSpellAbilityUnit(), true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS) a++ endif endfunction )) ((код
function Trig_heal_Actions takes nothing returns nothing
group g = CreateGroup()
boolexpr be = Condition(function Trig_heal_hero) real x = GetSpellTargetX() real y = GetSpellTargetY() real dist = 400 i = 6 a = 0 GroupEnumUnitsInRange(g, x, y, dist, be) ForGroup(g, function Trig_heal_heal) DestroyBoolExpr(be) DestroyGroup(g) msg("Исцелено героев: " + I2S(a)) g = null be = null if i > 0 then a = 0 g = CreateGroup() be = Condition(function Trig_heal_nothero) GroupEnumUnitsInRange(g, x, y, dist, be) ForGroup(g, function Trig_heal_heal) DestroyBoolExpr(be) DestroyGroup(g) msg("Исцелено не-героев: " + I2S(a)) msg(" ") g = null be = null endif endfunction )) ((код
=========================================================================== function InitTrig_heal takes nothing returns nothing gg_trg_heal = CreateTrigger() TriggerRegisterAnyUnitEventBJ(gg_trg_heal, EVENT_PLAYER_UNIT_SPELL_EFFECT) TriggerAddCondition(gg_trg_heal, Condition( function Trig_heal_Conditions)) TriggerAddAction(gg_trg_heal, function Trig_heal_Actions) endfunction ))
» вариант на Jass2 (том языке, на котором ты писал)
((код
globals
integer a_j2 integer i_j2 endglobals )) ((код
function trig_heal_j2_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'Heal' then return true endif return false endfunction )) ((код
function trig_heal_j2_hero takes nothing returns boolean
local unit u = GetFilterUnit() if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then set u = null return false elseif IsUnitType(u, UNIT_TYPE_STRUCTURE) set u = null return false elseif IsUnitType(u, UNIT_TYPE_MECHANICAL) set u = null return false elseif GetWidgetLife(u) < 0.405 set u = null return false elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE) set u = null return false elseif not(IsUnitType(u, UNIT_TYPE_HERO)) set u = null return false endif set u = null return true endfunction )) ((код
function trig_heal_j2_nothero takes nothing returns boolean
local unit u = GetFilterUnit() if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()), GetOwningPlayer(u)) then set u = null return false elseif IsUnitType(u, UNIT_TYPE_STRUCTURE) set u = null return false elseif IsUnitType(u, UNIT_TYPE_MECHANICAL) set u = null return false elseif GetWidgetLife(u) < 0.405 set u = null return false elseif GetWidgetLife(u) >= GetUnitState(u, UNIT_STATE_MAX_LIFE) set u = null return false elseif IsUnitType(u, UNIT_TYPE_HERO) set u = null return false endif set u = null return true endfunction )) ((код
function trig_heal_j2_heal takes nothing returns nothing
if i_j2 > 0 then set i_j2 = i_j2 - 1 call UnitDamageTarget(GetSpellAbilityUnit(), GetEnumUnit(), -4.00 * GetHeroInt(GetSpellAbilityUnit(), true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS) set a_j2 = a_j2 + 1 endif endfunction )) ((код
function trig_heal_j2_Actions takes nothing returns nothing
local group g = CreateGroup()
local boolexpr be = Condition(function trig_heal_j2_hero) local real x = GetSpellTargetX() local real y = GetSpellTargetY() local real dist = 400 set i_j2 = 6 set a_j2 = 0 call GroupEnumUnitsInRange(g, x, y, dist, be) call ForGroup(g, function trig_heal_j2_heal) call DestroyBoolExpr(be) call DestroyGroup(g) call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, "Исцелено героев: " + I2S(a_j2)) set g = null set be = null if i_j2 > 0 then set a_j2 = 0 set g = CreateGroup() set be = Condition(function trig_heal_j2_nothero) call GroupEnumUnitsInRange(g, x, y, dist, be) call ForGroup(g, function trig_heal_j2_heal) call DestroyBoolExpr(be) call DestroyGroup(g) call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, "Исцелено не-героев: " + I2S(a_j2)) call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 60, " ") set g = null set be = null endif endfunction )) ((код
=========================================================================== function InitTrig_heal_j2 takes nothing returns nothing set gg_trg_heal_j2 = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_heal_j2, EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(gg_trg_heal_j2, Condition( function trig_heal_j2_Conditions)) call TriggerAddAction(gg_trg_heal_j2, function trig_heal_j2_Actions) endfunction )) Проверил, работает, оптимизированно, cJass
Hares добавил:
приложил мапу Только у мя не получилось добавить туда эффект на цель. Просто не получилось.
Hares добавил: P.S. и за всё ето всего 4 опыта дали =( Отредактировано Hares, 31.12.2011 в 14:40. |
11.07.2011, 20:16 | #7
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
PiCkUpEr_AsT
offline
Опыт:
1,060Активность: |
Цитата:
довольно интересные взгляды) значит если 500 героев одновременно замутят этот спелл, запуститься 500 разных глобалок? или 2 глобалки на 500 юнитов? *и все это конечно же если глобалка объявлена внутри функции Код:
**а если у меня стоит триггер на отлов урона, он будет это фиксировать? ну т.е. если при положительном уроне вылетают циферки полученного дамага, то якобы при отрицательном уроне будут вылетать цифры полученного исцеления? П.С. Большое спасибо за наглядное разъяснение, буду теперь много чего переправлять... |
|
11.07.2011, 20:32 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
PiCkUpEr_AsT:
глобалка не может быть объявлена внутри функции, только внутри триггера, библиотеки, секции описаний итд. Более того, к ней можно подписать private//public, но это действует только для библиотек. В данном триге нет вэйтов (пауз) и BJ, поэтому будет работать как часы.
Просто я как-то сцётчики не обнулил и он сначала написал 11, потом 22, 33... Поэтому глобалки нужно обнулять. А хрен его знает. В зависимости от системы. SDMS показывает урон только меньше нуля, там работать будет (скорее всего). P.S. И старайся избегать БэДЖэев (BJ). Если у тебя есть Yass Helper, посмотри их код и ужаснись. Отредактировано Hares, 12.07.2011 в 21:36. |
12.07.2011, 21:29 | #9
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|