Добавлен Clamp,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
cJass
library UnitDamaged initializer InitRect {
#include "cj_types_priv.j"
private group allUnits;
private region mapArea;
private trigger Trigger[];
private int TrigsNum = 0;
private void unitDamagedEvent() {
TriggerRegisterUnitEvent(Trigger[TrigsNum], GetEnumUnit(), EVENT_UNIT_DAMAGED);
}
void AnyUnitDamagedEvent(trigger toTrigger) {
Trigger[TrigsNum] = toTrigger;
ForGroup(allUnits, function unitDamagedEvent);
TrigsNum++;
}
private void onUnitSpawn() {
for (int i = 0; i < TrigsNum; i++) {
TriggerRegisterUnitEvent(Trigger[i], GetEnteringUnit(), EVENT_UNIT_DAMAGED);
}
GroupAddUnit(allUnits, GetEnteringUnit());
}
private void onUnitDecay() {
GroupRemoveUnit(allUnits, GetDecayingUnit());
}
private void InitRect() {
trigger onSpawn = CreateTrigger();
trigger onDecay = CreateTrigger();
allUnits = CreateGroup();
mapArea = CreateRegion();
GroupEnumUnitsInRect(allUnits, GetWorldBounds(), null);
RegionAddRect(mapArea, GetWorldBounds());
TriggerRegisterEnterRegion(onSpawn, mapArea, null);
for (int i = 0; i < bj_MAX_PLAYER_SLOTS; i++) {
TriggerRegisterPlayerUnitEvent(onDecay, Player(i), EVENT_PLAYER_UNIT_DECAY, null);
}
TriggerAddAction(onSpawn, function onUnitSpawn);
TriggerAddAction(onDecay, function onUnitDecay);
}
}
vJass
library UnitDamaged initializer initRect
globals
private group allUnits
private region mapArea
private trigger Trigger[]
private integer TrigsNum = 0
endglobals
private function unitDamagedEvent takes nothing returns nothing
call TriggerRegisterUnitEvent(Trigger[TrigsNum], GetEnumUnit(), EVENT_UNIT_DAMAGED)
endfunction
function AnyUnitDamagedEvent takes trigger toTrigger returns nothing
set Trigger[TrigsNum] = toTrigger
call ForGroup(allUnits, function unitDamagedEvent)
set TrigsNum = TrigsNum + 1
endfunction
private function onUnitSpawn takes nothing returns nothing
local integer i = 0
loop
exitwhen (i == TrigsNum)
call TriggerRegisterUnitEvent(Trigger[i], GetEnteringUnit(), EVENT_UNIT_DAMAGED)
set i = i + 1
endloop
call GroupAddUnit(allUnits, GetEnteringUnit())
endfunction
private function onUnitDecay takes nothing returns nothing
call GroupRemoveUnit(allUnits, GetDecayingUnit())
endfunction
private function initRect takes nothing returns nothing
local integer i = 0
local trigger onSpawn = CreateTrigger()
local trigger onDecay = CreateTrigger()
set allUnits = CreateGroup()
set mapArea = CreateRegion()
call GroupEnumUnitsInRect(allUnits, GetWorldBounds(), null)
call RegionAddRect(mapArea, GetWorldBounds())
call TriggerRegisterEnterRegion(onSpawn, mapArea, null)
loop
exitwhen (i == bj_MAX_PLAYER_SLOTS)
call TriggerRegisterPlayerUnitEvent(onDecay, Player(i), EVENT_PLAYER_UNIT_DECAY, null)
set i = i + 1
endloop
call TriggerAddAction(onSpawn, function onUnitSpawn)
call TriggerAddAction(onDecay, function onUnitDecay)
endfunction
endlibrary
Добавление события:
call AnyUnitDamagedEvent(subscribingTrigger)
Источник урона (атаковавший юнит):
GetEventDamageSource()
Цель урона (атакованный юнит):
GetTriggerUnit()
Величина нанесённого урона:
GetEventDamage()
Установка: скопировать в Нестандартный Код Карты, дальнейших действий не требуется.
Ограничения:
- Нельзя использовать с динамичными триггерами
- Нельзя использовать более, чем с JASS_MAX_ARRAY_SIZE триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...
Показан только небольшой набор комментариев вокруг указанного.
Перейти к актуальным.
0
KaneThaumaturge
3 года назад
0
Clamp:
Да, это я уже понял, спасибо за уточнение.
1
ScorpioT1000
3 года назад
1
Давайте продолжим девятилетний срач. Нужно добавить условие, что юнит не неуязвимый, чтоб не регать из систем типа DGUI
0
rsfghd
3 года назад
0
ScorpioT1000, неуязвимость может быть не постоянной
0
ScorpioT1000
3 года назад
0
rsfghd, нужно сделать флаг в конфиге и уведомить об этом в документации
0
Clamp
3 года назад
0
ScorpioT1000:
Вот прикинь, нападут на тебя кнопки DGUI, ты отобьёшься, а урон не зарегется. Обидно будет!
0
ScorpioT1000
3 года назад
0
Clamp, я помню когда джонни ковырял систему еще до релиза, у него был такой баг, что кнопки начинали нападать на героя, рофлы те ещё были
Показан только небольшой набор комментариев вокруг указанного.
Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.