Сейчас 07:53:39 Вторник, 7 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Селекция группы
Селекция группы
RaiN_SДата: Четверг, 25 Апреля 2013, 17:10:50 | Сообщение # 1
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Привет. :)
Вот код.
Код
function Trig_C2_5I2I2_Timer takes nothing returns nothing
      local timer t = GetExpiredTimer()
      local integer id = GetHandleId(t)
      local group gr = LoadGroupHandle( udg_hash, id, 0)
      local group grt = CreateGroup()
      local unit u
      local unit ud = LoadUnitHandle( udg_hash, id, 1)
      local unit caster = LoadUnitHandle( udg_hash, id, 3)
      local integer n = LoadInteger( udg_hash, id, 2)
      local real l   
      if n<125 and GetUnitState(ud, UNIT_STATE_LIFE)>0.405 then
          call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null)
          loop
              set u = FirstOfGroup(grt)
              exitwhen(u == null)
              if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) and not (IsUnitInGroup(u, gr)) then
                  call GroupAddUnit(gr, u)
              endif
              call GroupRemoveUnit(grt, u)
          endloop
          loop
              set u = FirstOfGroup(gr)
              exitwhen(u == null)
              if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405)  then
                  call IssueTargetOrder( u, "attack", ud )
                  call GroupAddUnit( grt, u)
              endif
              call GroupRemoveUnit(gr, u)
          endloop
          call SaveGroupHandle( udg_hash, id, 0, grt)
          set n = n + 1
          call SaveInteger( udg_hash, id, 2, n)
          set l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.)
          call SetUnitScale(ud, l ,l,l)
      else
          call PauseTimer(t)
          set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE)
          call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null)
          loop
              set u = FirstOfGroup(grt)
              exitwhen(u == null)
              if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 then
                  call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
              endif
              call GroupRemoveUnit(grt, u)
          endloop
          call KillUnit(ud)
          call DestroyTimer(t)
          call DestroyGroup(gr)
          call FlushChildHashtable( udg_hash, id)
      endif
      call DestroyGroup(grt)
      set gr = null
      set t = null
      set u = null
      set caster = null
      set ud = null
endfunction

Почему-то caster атакует ud, и урон при завершении таймера не наносится. Не могу найти ошибку.




Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 17:58:43
 

ВолчачкаДата: Четверг, 25 Апреля 2013, 17:40:13 | Сообщение # 2
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата (RaiN_S)
local group grt = CreateGroup()

утечная группа.
call DestroyGroup(grt)
должен стоять после eninf'a
Цитата (RaiN_S)
call SaveUnitHandle( udg_hash, id, 1, ud)

лол загружать, потом сохранять он и так хранится в кеше, пока ты его не FlushChildHashtable( udg_hash, id)
 

RaiN_SДата: Четверг, 25 Апреля 2013, 17:48:22 | Сообщение # 3
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Цитата (Волчачка)
лол загружать, потом сохранять он и так хранится в кеше, пока ты его не FlushChildHashtable( udg_hash, id)

Упс, и правда, пропустил мимо глаз. :)

Ну, это незначительные ошибки, проблема осталась на своём месте.


 

ВолчачкаДата: Четверг, 25 Апреля 2013, 18:01:34 | Сообщение # 4
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата (RaiN_S)
(GetWidgetLife(u) > 0.405)

Цитата (RaiN_S)
GetUnitState(ud, UNIT_STATE_LIFE)>0.405

Попробуй виджеты на поменять на стейты.
Цитата (RaiN_S)
l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.)

Интересно.

В вообще сколько макс хп у кастера?
 

RaiN_SДата: Четверг, 25 Апреля 2013, 18:13:58 | Сообщение # 5
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Кастер - герой, у него меняется, а у ud ровно 1000.
Цитата (Волчачка)
Попробуй виджеты на поменять на стейты.

Пробовал менять все вхождения виджет на стэйт и все стэйт на виджет. В обоих случаях никаких изменений.

Добавлено (25 Апреля 2013, 18:13:58)
---------------------------------------------
А какую функцию лучше использовать при проверке текущего хп в общем случае?




Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 18:12:33
 

ВолчачкаДата: Четверг, 25 Апреля 2013, 18:16:10 | Сообщение # 6
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата (RaiN_S)
ud ровно 1000.

set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE)
1000. - 1000. = 0. :D
 

RaiN_SДата: Четверг, 25 Апреля 2013, 18:20:30 | Сообщение # 7
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Цитата (Волчачка)
set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE)
1000. - 1000. = 0. :D

UNIT_STATE_LIFE - текущее здоровье. Чем меньше хп у ud к моменту завершения заклинания, тем больше должно нанестись урона окружающим противникам. В этом смысл способности.
ud - это шарик, который растет, когда его бьют и взрывается при смерти. :)




Сообщение отредактировал RaiN_S - Четверг, 25 Апреля 2013, 18:21:34
 

ВолчачкаДата: Четверг, 25 Апреля 2013, 18:35:57 | Сообщение # 8
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Когда полсе окончания действия способности, сколько хп у шарика оставалось?
Цитата (RaiN_S)
когда его бьют

Его били?)
Какое значение имеет изначально udg_M?
 

RaiN_SДата: Четверг, 25 Апреля 2013, 18:46:02 | Сообщение # 9
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Цитата (Волчачка)
Когда полсе окончания действия способности, сколько хп у шарика оставалось?

По разному.
Цитата (Волчачка)
Какое значение имеет изначально udg_M?

0.
Там дело не в числах. Даже если константу ввести, то все равно урон не наносится и герой все равно бьет шарик. Там что-то либо с группами, либо с проверкой условий не то.
Цитата (Волчачка)
Его били?)

Код
call IssueTargetOrder( u, "attack", ud )

Ну да, он вообще злой шарик. :)


 

DragoNДата: Четверг, 25 Апреля 2013, 18:50:05 | Сообщение # 10
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Цитата (Волчачка)
он и так хранится в кеше

кэш != хэш


El Psy Congroo
 

ВолчачкаДата: Четверг, 25 Апреля 2013, 19:53:57 | Сообщение # 11
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Я тебя понял, чешуйчатый. Я просто опечатался.
RaiN_S, попробуй call GroupClear(grt) после call PauseTimer(t)
 

НаклзДата: Четверг, 25 Апреля 2013, 20:04:32 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 1431
Награды: 0
Репутация: 760
Блокировки:
Цитата (Волчачка)
чешуйчатый

!?
 

DragoNДата: Четверг, 25 Апреля 2013, 20:38:57 | Сообщение # 13
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Цитата (Наклз)

!?

мохнатый видимо намекнул на мой ник


El Psy Congroo
 

RaiN_SДата: Пятница, 26 Апреля 2013, 14:55:51 | Сообщение # 14
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Цитата (Волчачка)
RaiN_S, попробуй call GroupClear(grt) после call PauseTimer(t)

Не работает.
Волчачка, проверь, пожалуйста, логику построения кода. Всякие "авось" я и сам неоднократно проверял. Разве что перебор группы через ForGroup не делал, это ведь через ж*пу. :)


 

ВолчачкаДата: Пятница, 26 Апреля 2013, 15:15:20 | Сообщение # 15
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
RaiN_S, попробуй так:
Код

              loop
                 set u = FirstOfGroup(grt)
                    
                 if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 and u !=null then
                     call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                 endif
                 call GroupRemoveUnit(grt, u)
                 exitwhen u == null
             endloop    


Добавлено (26 Апреля 2013, 15:15:20)
---------------------------------------------
Слушай, а ты делал такое в инициализации карты?
Код
set udg_hash = InitHashtable()


Сообщение отредактировал Волчачка - Пятница, 26 Апреля 2013, 15:15:37
 

RaiN_SДата: Пятница, 26 Апреля 2013, 15:25:18 | Сообщение # 16
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Цитата (Волчачка)
RaiN_S, попробуй так:

А какой смысл проверять null?
Цитата (Волчачка)
Слушай, а ты делал такое в инициализации карты?

Ну блин, конечно. Так бы и вовсе не работало.

Добавлено (26 Апреля 2013, 15:25:18)
---------------------------------------------

Цитата (Волчачка)
RaiN_S, попробуй так:

Попробовал. Не то.


 

ВолчачкаДата: Пятница, 26 Апреля 2013, 15:34:59 | Сообщение # 17
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
RaiN_S, значит так я проверил у себя на основе пехотинца :D
Код
function Trig_cast_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == 'ANsi'  
endfunction

function Trig_cast_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
call SaveGroupHandle(udg_hash, id, 0, CreateGroup())
call SaveUnitHandle(udg_hash, id, 1, CreateUnit(GetOwningPlayer(caster),'hfoo',x,y, GetUnitFacing(caster)))
call SaveInteger(udg_hash, id, 2, 0)
call SaveUnitHandle(udg_hash, id, 3, caster)
call TimerStart(t, .08, true, function Trig_C2_5I2I2_Timer)
set caster = null
set t = null
set id = 0
set x = 0.
set y = 0.
endfunction

//===========================================================================
function InitTrig_cast takes nothing returns nothing
     set gg_trg_cast = CreateTrigger(  )
     call TriggerRegisterUnitEvent( gg_trg_cast, gg_unit_Nbrn_0000, EVENT_UNIT_SPELL_EFFECT )
     call TriggerAddCondition( gg_trg_cast, Condition( function Trig_cast_Conditions ) )
     call TriggerAddAction( gg_trg_cast, function Trig_cast_Actions )
endfunction

^ Типа триггер запуска
Использовал твой нетронутый код
Код

function Trig_C2_5I2I2_Timer takes nothing returns nothing
       local timer t = GetExpiredTimer()
       local integer id = GetHandleId(t)
       local group gr = LoadGroupHandle( udg_hash, id, 0)
       local group grt = CreateGroup()
       local unit u
       local unit ud = LoadUnitHandle( udg_hash, id, 1)
       local unit caster = LoadUnitHandle( udg_hash, id, 3)
       local integer n = LoadInteger( udg_hash, id, 2)
       local real l    
       if n<125 and GetUnitState(ud, UNIT_STATE_LIFE)>0.405 then
           call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null)
           loop
               set u = FirstOfGroup(grt)
               exitwhen(u == null)
               if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405) and not (IsUnitInGroup(u, gr)) then
                   call GroupAddUnit(gr, u)
               endif
               call GroupRemoveUnit(grt, u)
           endloop
           loop
               set u = FirstOfGroup(gr)
               exitwhen(u == null)
               if (IsUnitEnemy(u, GetOwningPlayer(caster))) and not (IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE)) and (GetWidgetLife(u) > 0.405)  then
                   call IssueTargetOrder( u, "attack", ud )
                   call GroupAddUnit( grt, u)
               endif
               call GroupRemoveUnit(gr, u)
           endloop
           call SaveGroupHandle( udg_hash, id, 0, grt)
           set n = n + 1
           call SaveInteger( udg_hash, id, 2, n)
           set l = 2. - (GetUnitState(ud, UNIT_STATE_LIFE)/1000.)
           call SetUnitScale(ud, l ,l,l)
       else
           call PauseTimer(t)
           set l = 1000. - GetUnitState(ud, UNIT_STATE_LIFE)
           call GroupEnumUnitsInRange(grt, GetUnitX(ud), GetUnitY(ud), 355. , null)
           loop
               set u = FirstOfGroup(grt)
               exitwhen(u == null)
               if IsUnitEnemy(u, GetOwningPlayer(caster)) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and GetWidgetLife(u) > 0.405 then
                   call UnitDamageTarget(caster, u, udg_M + l , false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
               endif
               call GroupRemoveUnit(grt, u)
           endloop
           call KillUnit(ud)
           call DestroyTimer(t)
           call DestroyGroup(gr)
           call FlushChildHashtable( udg_hash, id)
       endif
       call DestroyGroup(grt)
       set gr = null
       set t = null
       set u = null
       set caster = null
       set ud = null
endfunction

Этот у меня всё робит.
 

RaiN_SДата: Пятница, 26 Апреля 2013, 15:57:58 | Сообщение # 18
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Пффффффф...
Нашел ошибку. хД
Короче, когда копировал часть кода из другого триггера, чтобы не морочиться с созданием эффектов, нечаянно захватил с собой set caster = null хД
Ну и забыл про него. Считал раз тот триггер работает, то в этой части кода ошибок быть не должно.
Вот дурак, а.
Ладно, со мной бывает. :)
Спасибо за попытки помочь. :)

Добавлено (26 Апреля 2013, 15:57:58)
---------------------------------------------
В следующий раз надо будет код всего триггера скидывать, а не только конкретные функции. :)


 

ВолчачкаДата: Пятница, 26 Апреля 2013, 16:06:48 | Сообщение # 19
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
RaiN_S, Не за что, зато нежелательные утечки убрали. :)
 

RaiN_SДата: Пятница, 26 Апреля 2013, 16:12:00 | Сообщение # 20
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
Посмотри пожалуйста вот это.
Не знаю, у меня есть идея проверять всё по четвертям, но кажется, что есть более короткий путь.
А эту тему можно закрыть.




Сообщение отредактировал RaiN_S - Пятница, 26 Апреля 2013, 16:12:22
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Селекция группы
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz