Добавлен 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 триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Clamp
Кстати, версия без проблемы с условием:
ScorpioT1000:
Короче заканчивай ныть. Приду с работы, покажу как над писать, заодно как свои эвенты создавать.
Ах, прости, я забыл, это не твоя сильная сторона, аргументировать своё мнение.
Мнение СВДНа о ней, который сказал, что она не имеет недостатков (версия с массивом триггеров) я ценю (почему бы? а, он не голословит) заметно больше твоего.
Отредактирован Faion
Короче логика идиотская, все эвенты должны быть подписаны а один триггер, точка.
ScorpioT1000:
это в 2004 году еще было
Отредактирован Clamp
ScorpioT1000:
Bornikkeny:
/о
ScorpioT1000:
Отредактирован Clamp
1 юнит - 1 ивент.
Каждый юнит на карте должен иметь этот ивент (за явными исключениями вроде ДГУИ) для полноценной работы системы. Так или иначе, тебе придётся пройтись по каждому юниту, чтобы каждый получил этот ивент. Ты не можешь создать свою переменную типа "event", нету нативных функций для этого.
Советую закончить этот спор, ты ведёшь его очень слабо, предоставляя аргументы по принципу "новое - хорошо забытое старое". Количество триггеров, которые работают с этим событием - это только выбор создателя карты. У меня все способности на одном, а счётчики для кое каких систем - на другом. Итого их два, и мне норм.
Кет: