Сейчас 09:42:23 Пятница, 3 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » DamageSystem
DamageSystem
BuРyCДата: Понедельник, 06 Июня 2011, 14:13:46 | Сообщение # 1
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
Запускается только в JNGP. Если его у вас нет, то вам его необходимо скачать.
Так же для использования cJass версии и запуска этой карты из редактора вам нужен AdicHelper, который надо установить в JNGP.

Описание:
Данная система даёт возможность добовлять к триггеру событие " Юнит получил урон ". Как известно, стандартно это событие можно добавить указывая определённого юнита. Эта ситема регистрирует событие "Получил урон ", для всех юнитов.
Импорт:
Скопируйте триггер один из двух тириггеров из категории "Система". Один из них cJass версия, второй vJass. Копируте тот , который вам более понятен.
Функции:
DamageSystem_TriggerRegisterAllUnitDamaged takes trigger trg returns nothing - Регестрирует для триггера наше новое событие.
DamageSystem_RemoveTriggerFromSystem takes trigger t returns nothing - Перед удалением триггера, для которого было зарегестрированно наше новое событие, обязательно делайте это действие.
Функции получения:
Они те же самые, т.е это функции GetTriggerUnit() , GetEventDamage() , и GetEventDamageSource().
Использование в GUI:
Если вы не владеете знаниями Jass, то вы так же можете использовать ситему в GUI триггерах. Для этого в триггере с событием Инициализация карты, в действиях сделайте следущее. Личный сценарий : DamageSystem_TriggerRegisterAllUnitDamaged ( gg_trg_Название триггера)

Добавлено (06-06-2011, 14:13)
---------------------------------------------
P.S на форуме уже была такая система.
Но эта менее громоздкая и отвечает именно за получение урона.

 

SirNikolasДата: Понедельник, 06 Июня 2011, 14:54:52 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Код выложи.

 

DragoNДата: Понедельник, 06 Июня 2011, 15:32:41 | Сообщение # 3
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
код выложи, качать не хочу

El Psy Congroo
 

BuРyCДата: Понедельник, 06 Июня 2011, 15:54:24 | Сообщение # 4
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
Code
library DamageSystem initializer Init {

#include "cj_types.j"
#include "cj_typesEX.j"

     private constant trigger AddEventTrig = new trigger
     private int iTrig = 0
     private trigger array Take_Trig

     private bool AddEvent_Conditions () {
         return GetUnitAbilityLevel(GetTriggerUnit(),'Aloc') == 0  
     }

    private void AddEvent () {
         int i = 0
             whilenot i == iTrig  {
                 TriggerRegisterUnitEvent ( Take_Trig[++i],GetTriggerUnit(), EVENT_UNIT_DAMAGED)
             }  
     }

     public void RemoveTriggerFromSystem ( trigger t ) {
         int i = 0
         whilenot t == Take_Trig[++i] {}
         --iTrig
         whilenot i == iTrig { Take_Trig[i] = Take_Trig[i++] }
          
     }
      
     public void TriggerRegisterAllUnitDamaged (trigger trg) {
         group g = new group
         unit u
         int i = 0
         GroupEnumUnitsInRect (g,bj_mapInitialPlayableArea,null)
             do {
                 u = FirstOfGroup(g)
                 exitwhen u == null
                 TriggerRegisterUnitEvent ( trg, u, EVENT_UNIT_DAMAGED)
                 GroupRemoveUnit( g, u)
             }
         Take_Trig[++iTrig] = trg
         DestroyGroup(g)
         g = null
     }    

     private void Init () {
         region r = new region
         RegionAddRect( r, bj_mapInitialPlayableArea)
         TriggerRegisterEnterRegion( AddEventTrig, r, null)
         TriggerAddCondition( AddEventTrig, Condition(function AddEvent_Conditions))
         TriggerAddAction(AddEventTrig,function AddEvent)
         r = null
     }
}
 

AjaccioДата: Понедельник, 06 Июня 2011, 16:20:23 | Сообщение # 5
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Quote (BuРyC)
громоздкая




Quote (BuРyC)
group g = new group


Хорошо бы сделать группу глобальной и перебор не в цикле, а в условии GroupEnumUnitsInRect, да?
БТВ, событие TriggerRegisterEnterRegion не отлавливает "призванных" воинов.
А вообще не смотрел. smiletrollskip


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

SirNikolasДата: Понедельник, 06 Июня 2011, 16:24:15 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ajaccio)
БТВ, событие TriggerRegisterEnterRegion не отлавливает "призванных" воинов.
В смысле? У меня на нем один спелл построен. С призванными.

Добавлено (06-06-2011, 16:24)
---------------------------------------------

Quote (BuРyC)
Code
     private bool AddEvent_Conditions () {
           return GetUnitAbilityLevel(GetTriggerUnit(),'Aloc') == 0
        }
А ты уверен, что это будет работать?


 

AjaccioДата: Понедельник, 06 Июня 2011, 16:30:21 | Сообщение # 7
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Вы правы, все таки отлавливает. Правда функции GetWidgetLife(...) для них почему-то возвращает 0.0, во как. hmm
А вообще я о способности "Астральный зверь".


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

SirNikolasДата: Понедельник, 06 Июня 2011, 16:41:09 | Сообщение # 8
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ajaccio)
Правда, функция GetWidgetLife(...) для них почему-то возвращает 0.0, во как.
А ты кого в нее передаешь? GetTriggerUnit() или GetFilterUnit()? Если ты добавляешь действие методом
Code
call TriggerRegisterEnterRegion(CreateTrigger(), r, Filter(function Trig_Test_Actions))
, то из всех реакций на события будет работать только GetFilterUnit().


 

AjaccioДата: Понедельник, 06 Июня 2011, 16:46:22 | Сообщение # 9
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
private bool CreateNewMember()
{
___if (GetTriggerEventId() == EVENT_UNIT_DAMAGED) {return false}
___unit targ = GetFilterUnit()

___BJDebugMsg(R2S(GetWidgetLife(targ)))___//Выводит 0.0, у остальных нормально. hmm

___if (GetWidgetLife(targ) > 0.0 && GetUnitAbilityLevel(targ, SPELL_MARK) == 0) {
______TriggerRegisterUnitEvent(gg_trg_EMDSystem, targ, EVENT_UNIT_DAMAGED)
______UnitAddAbility(targ, SPELL_MARK)
______UnitMakeAbilityPermanent(targ, true, SPELL_MARK)
___}
___targ = null
___return false
}


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

BuРyCДата: Вторник, 07 Июня 2011, 22:42:03 | Сообщение # 10
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
Quote (Ajaccio)
Хорошо бы сделать группу глобальной и перебор не в цикле, а в условии GroupEnumUnitsInRect, да?

avtorklif
Точно :)

Добавлено (07-06-2011, 22:42)
---------------------------------------------

Quote (BuРyC)
громоздкая

Quote (BuРyC)
отвечает именно за получение урона.
Ajaccio, Я имел ввиду что, твоя содержит кучу функций, к примеру, на определение типа атаки, моя же , только для регистрации события.
 

Omni174Дата: Среда, 08 Июня 2011, 22:24:34 | Сообщение # 11
Группа: Заблокированные
Сообщений: 1274
Награды: 1
Репутация: 359
Блокировки:
Юзай хайв
 

BuРyCДата: Среда, 08 Июня 2011, 23:26:42 | Сообщение # 12
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
Quote
Юзай хайв
Идиот?
 

DiabfallДата: Четверг, 09 Июня 2011, 09:14:19 | Сообщение # 13
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Quote (BuРyC)
TriggerRegisterUnitEvent ( Take_Trig[++i],GetTriggerUnit(), EVENT_UNIT_DAMAGED)

Это событие регистрируется для каждого нового юнита?
 

BuРyCДата: Четверг, 09 Июня 2011, 10:37:37 | Сообщение # 14
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
для всех юнитов на карте, а так же для всех, появляющихся.
 

DiabfallДата: Четверг, 09 Июня 2011, 10:43:29 | Сообщение # 15
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Quote (BuРyC)
для всех юнитов на карте, а так же для всех, появляющихся.

Событие же нельзя удалить. => Они будут накапливаться и висеть в памяти?
 

BuРyCДата: Четверг, 09 Июня 2011, 10:51:07 | Сообщение # 16
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
возможно, но поставил код на убийство с одного удара, крипов, которые мгновенно возрождаются, ушел из дома на 4 часа, когда пришел, не было ни одного лага.
 

SirNikolasДата: Четверг, 09 Июня 2011, 11:04:19 | Сообщение # 17
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
BuРyC, событие для появляющихся на карте добавляется только в том случае, если они имеют способность "Москиты". Именно поэтому твой, несомненно, оригинальный, способ тестирования не показал никаких лагов.

 

BuРyCДата: Четверг, 09 Июня 2011, 11:21:18 | Сообщение # 18
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: -27
Блокировки:
нет, для тех кто не имеет способность москиты, как раз и добавляется, в докозательство, обрати внимание что плавающий текст появляется над всеми новыми юнитами.
Это показано в карте, ссылка на которую в первом посте.

Добавлено (09-06-2011, 11:21)
---------------------------------------------
система работает со всеми кроме москитов.

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » DamageSystem
  • Страница 1 из 1
  • 1
Поиск:

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