Добавлен Clamp,
опубликован
Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
cJass
library UnitDamaged initializer InitRect
{
region Region
nothing Adder()
{
if(GetEnteringUnit()!=null)
{
TriggerRegisterUnitEvent(GetTriggeringTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
}
}
nothing AnyUnitDamagedEvent(trigger trg)
{
group CurrentUnits = CreateGroup()
unit Picked
GroupEnumUnitsInRect(CurrentUnits,bj_mapInitialPlayableArea,null)
loop
{
Picked = FirstOfGroup(CurrentUnits)
exitwhen Picked == null
TriggerRegisterUnitEvent(trg,Picked,EVENT_UNIT_DAMAGED)
GroupRemoveUnit(CurrentUnits,Picked)
}
TriggerRegisterEnterRegion(trg,Region,null)
TriggerAddAction(trg,function Adder)
DestroyGroup(CurrentUnits)
CurrentUnits=null
}
nothing InitRect()
{
Region = CreateRegion()
RegionAddRect(Region, bj_mapInitialPlayableArea)
}
}
vJass
library UnitDamaged initializer InitRect
globals
region Region
endglobals
function Adder takes nothing returns nothing
if GetEnteringUnit()!=null then
call TriggerRegisterUnitEvent(GetTriggeringTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endif
endfunction
function AnyUnitDamagedEvent takes trigger trg returns nothing
local group CurrentUnits = CreateGroup()
local unit Picked
call GroupEnumUnitsInRect(CurrentUnits,bj_mapInitialPlayableArea,null)
loop
set Picked = FirstOfGroup(CurrentUnits)
exitwhen Picked == null
call TriggerRegisterUnitEvent(trg,Picked,EVENT_UNIT_DAMAGED)
call GroupRemoveUnit(CurrentUnits,Picked)
endloop
call TriggerRegisterEnterRegion(trg,Region,null)
call TriggerAddAction(trg,function Adder)
call DestroyGroup(CurrentUnits)
set CurrentUnits=null
set Picked=null
endfunction
function InitRect takes nothing returns nothing
set Region = CreateRegion()
call RegionAddRect(Region, bj_mapInitialPlayableArea)
endfunction
endlibrary
Регистрация события идёт следующим образом:
- все существующие юниты на карте добавляются в группу и на каждого нужному триггеру добавляется событие получения урона.
- указанному триггеру регистрируется событие "юнит входит на игровую территорию".
- при реакции на добавленное событие для юнита сразу добавляется событие получения урона.
Есть одна проблема: при создании нового юнита сработает каждый триггер с событием на урон.
Лечится введением условия.
function TrigFunc takes someone returns somemore
if GetEnteringUnit() == null then
//действия при получении урона
endif
endfunction
Событие добавляется так:
call AnyUnitDamagedEvent(SomeTrigger)
Ссылки на сущности при использовании системы:
Источник урона (атаковавший юнит):
Источник урона (атаковавший юнит):
GetEventDamageSource()
Величина нанесённого урона:
GetEventDamage()
Цель урона (атакованный юнит):
GetTriggerUnit()
Никаких дополнительных переменных вводить не нужно, достаточно просто скопировать в Нестандартный Код Карты.
Версия без проблемы с условием, но с дополнительным массивом триггеров (не использовать в динамических триггерах):
Код
library UnitDamaged initializer InitRect
{
private region Region
private group Group
private int TrigsNum = 0
private trigger array Trigger
private void Adder()
{
int i = 0
loop
{
TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
exitwhen i==TrigsNum
i++
}
GroupAddUnit(Group,GetEnteringUnit())
}
private void Registrator()
{
TriggerRegisterUnitEvent(Trigger[TrigsNum],GetEnumUnit(),EVENT_UNIT_DAMAGED)
}
void AnyUnitDamagedEvent(trigger trg)
{
Trigger[TrigsNum]=trg
ForGroup(Group,function Registrator)
TrigsNum++
}
private void InitRect()
{
trigger trg = CreateTrigger()
Group = CreateGroup()
Region = CreateRegion()
GroupEnumUnitsInRect(Group,bj_mapInitialPlayableArea,null)
RegionAddRect(Region, bj_mapInitialPlayableArea)
TriggerRegisterEnterRegion(trg,Region,null)
TriggerAddAction(trg,function Adder)
}
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
Комментарии пока отсутcтвуют.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.