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