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

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

Ответ
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
On Damage Event Template

Что это?

Это кусок кода, который можно использовать в случаях, где надо совершить действия над воинами, при получении урона.
» Как оно работает?
При атаке, атакованный юнит проверяется на наличие в глобальной группе. Если он внутри ее, то ничего не делается, иначе мы добавляем его в группу и регистрируем событие на получение урона, относительно того воина. При смерти воина, если он находится в группе, удаляем его оттуда.

Использование

Наработка требует Jass New Gen Pack
Создаете триггер с произвольным именем, вставляете шаблон, задаете свои условия, свои действия... используете.
» шаблон
library OnDamageTemplate initializer OnInit
    
    globals
        private group G=CreateGroup()
        private trigger T=CreateTrigger()
    endglobals
    
    private function OnAttack takes nothing returns nothing
        call GroupAddUnit(G,GetTriggerUnit())
        call TriggerRegisterUnitEvent(T,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
    endfunction
    
    private function OnAttackConditions takes nothing returns boolean
        return not IsUnitInGroup(GetTriggerUnit(),G)
    endfunction
    
    private function OnDamage takes nothing returns nothing
        // ЗДЕСЬ ВАШИ ДЕЙСТВИЯ
    endfunction
    
    private function OnDamageConditions takes nothing returns boolean
        return // ЗДЕСЬ ВАШИ УСЛОВИЯ
    endfunction
    
    private function OnDeath takes nothing returns nothing
        call GroupRemoveUnit(G,GetTriggerUnit())
    endfunction
    
    private function OnDeathConditions takes nothing returns boolean
        return IsUnitInGroup(GetTriggerUnit(),G)
    endfunction
    
    private function OnInit takes nothing returns nothing 
        local trigger attack=CreateTrigger()
        local trigger death=CreateTrigger()
        local integer index=0
        
        loop
            exitwhen index>15
            call TriggerRegisterPlayerUnitEvent(attack,Player(index),EVENT_PLAYER_UNIT_ATTACKED,null)
            call TriggerRegisterPlayerUnitEvent(death,Player(index),EVENT_PLAYER_UNIT_DEATH,null)
            set index=index+1
        endloop
        
        call TriggerAddCondition(attack,Condition(function OnAttackConditions))
        call TriggerAddAction(attack,function OnAttack)
        call TriggerAddCondition(death,Condition(function OnDeathConditions))
        call TriggerAddAction(death,function OnDeath)
        call TriggerAddCondition(T,Condition(function OnDamageConditions))
        call TriggerAddAction(T,function OnDamage)
        
        set attack=null
        set death=null
    endfunction
    
endlibrary
При редактировании кода, следует помнить что воин который получил урон - GetTriggerUnit(), а воин который нанес урон - GetEventDamageSource().

Заключение

Надеюсь это кому то поможет, спасибо за внимание.
По возможности, указывайте автора, при использовании.

Отредактировано bee, 12.05.2010 в 14:08.
Старый 09.05.2010, 13:32
YellowStar
poon
offline
Опыт: 15,144
Активность:
bee, чем лучше уже имеющихся систем? Ничем. А собсно зачем оно тогда?
Старый 09.05.2010, 15:22
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
буржуские системы слишком громоздкие, мне так кажется
имхо - такой способ удобнее всего, и не потому, что его сделал я
зачем?
а нужна причина?
+ легко импортитовать
Старый 09.05.2010, 15:33
respect_gg

offline
Опыт: 3,950
Активность:
Сори за тупой вопрос :) Но все же, а как вставить еще одно условие ?)) Я просто еще не оч хорошо в этом шарю, но вот пытаюсь разобраться. Одно нужное условие поставил, действия тоже. Все работает прекрасно, но нужно еще одно условие, но вот не знаю как его туда вставить :))
Старый 12.05.2010, 13:23
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
respect_gg
в действия уже непосредственно пишешь:
if параметры условия (and если понадобиться) then
//тут твои действия входящие в условие
endif


по теме
ну вроде бы не плохо, порадовало то, что не юзаешь хеш

З.Ы. не только буржуйские системы "больше"
Старый 12.05.2010, 13:40
ZeToX2007

offline
Опыт: 7,009
Активность:
А если урон нанесён заклинанием?
Старый 12.05.2010, 13:54
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
ZeToX2007, не важно, сам факт наличие полученного урона уже сработает триггер
Старый 12.05.2010, 14:01
ZeToX2007

offline
Опыт: 7,009
Активность:
Sidhe:
ZeToX2007, не важно, сам факт наличие полученного урона уже сработает триггер
Несработает, если до этого этот юнит небыл атакован
Старый 12.05.2010, 14:04
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
respect_gg:
Сори за тупой вопрос :) Но все же, а как вставить еще одно условие ?)) Я просто еще не оч хорошо в этом шарю, но вот пытаюсь разобраться. Одно нужное условие поставил, действия тоже. Все работает прекрасно, но нужно еще одно условие, но вот не знаю как его туда вставить :))
в функции OnDamageConditions, после return вводи свои условия, перечисление разделяется 'and'
например
return <условие1> and <условие2> and <условие3> ...
ZeToX2007, триггер срабатывает на получение любого урона любым юнитом.
Добавил инфу, как это работает.
ZeToX2007, щяс понял что ты имел ввиду. Ну тогда или я перепишу шаблон или у некоторых способностей будет маленький баг. Но все же то, что я сделал расчитанно на быстрое добавление нужной весчи, в основном на атаку.

Отредактировано bee, 12.05.2010 в 14:12.
Старый 12.05.2010, 14:05
ZeToX2007

offline
Опыт: 7,009
Активность:
bee:
ZeToX2007, триггер срабатывает на получение любого урона любым юнитом.
ZeToX2007:
Несработает, если до этого этот юнит небыл атакован
У тебя событие:
EVENT_PLAYER_UNIT_ATTACKED
то есть, у тебя юнит ещё не в группе и на него кастуют заклинание.
Старый 12.05.2010, 14:11
Doc

offline
Опыт: 63,163
Активность:
Фейл. Система детский лепет, делается за 3 минуты. Если юнита до этого не атакован то событие не сработает. Неверно само построение тригера, функция одна на всех, неудобно.
Старый 12.05.2010, 14:11
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
DoctorGester:
Фейл. Система детский лепет, делается за 3 минуты. Если юнита до этого не атакован то событие не сработает. Неверно само построение тригера, функция одна на всех, неудобно.
знаю. док, ты же умный человек, можешь написать систему покруче, НО есть люди, которые не могут, для них и система
в будущем, скорее всего этого не произойдет, но если произойдет, то я исправлю этот баг, мне просто немного времени нужно, вечерком за чашкой чая
Старый 12.05.2010, 14:14
ZeToX2007

offline
Опыт: 7,009
Активность:
DoctorGester:
функция одна на всех, неудобно.
юзай cJass.
ZeToX2007 добавил:
Лучше всего делать отлов урона на cJass.
  1. Добавить события всем юнитам на карте
  2. Событие добавлять: всем кто построился в бараках, вызванам и тд.
  3. Отловить с помощью сJass все функции на создания юнита и добавить событие.
вот, вроде всё.
Старый 12.05.2010, 14:22
Doc

offline
Опыт: 63,163
Активность:
Я не говорю что система плохая. Нужно лишь поправить событие и убрать приватность тригера чтобы в него можно было добавлять свои кондишны. Ахах зетокс смешной, я такую систему без багов на гуи делал, не смеши своим сж, достаточно добавить событие вхождения в регион.
Старый 12.05.2010, 15:01
Rewenger
The culprit will not die
offline
Опыт: 35,873
Активность:
Лучше всего делать отлов урона на cJass.
Как будто это позитивно скажется на быстродействии и полезности для малоподкованной (НО есть люди, которые не могут, для них и система) в jass аудитории.
Старый 12.05.2010, 17:20
Ответ

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

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

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

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



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