Добавлен ImbaStyle
Как пользоваться одним глобальным таймером? Как отслеживать его время в других триггерах и удобней ли это, чем создавать много таймеров?
Принятый ответ
Кастомная система оглушения без использования способностей на глобальном таймере, с комментариями, говорящими названиями переменных и с адекватным форматированием. Без структур, так как они здесь излишни.
По такому же принципу можно реализовать всё, что угодно, лепится на единый таймер. Примерно по такому принципу работают все существующие игры (серверные/клиентские тики), только хранение данных по-другому реализовано (здесь параллельные массивы).
Код
library StunUnit // initializer Init
{
private timer periodicTimer = CreateTimer() // Can be replaced with main map timer
private unit unitsStack[]
private effect effectsStack[] // Stun effect storage
private float timeRemaining[] // Time of stun left
private int stackCounter = 0
#define private TICK_PERIOD = 0.05
#define private STACK_LIMIT = 8190
#define private STUN_EFFECT = "Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl"
#define private ORDERID_STOP = 0xD0004
// Looking for id of specified unit in stack
private int StackSearch(unit givenUnit) {
int i = -1;
while(i++ < stackCounter) {
if (givenUnit == unitsStack[i]) {
return i;
}
}
return -1;
}
// Add unit to stack with overflow check
private void StackPush(unit givenUnit, float duration) {
if(stackCounter < STACK_LIMIT) {
unitsStack [stackCounter] = givenUnit;
effectsStack [stackCounter] = AddSpecialEffectTarget(STUN_EFFECT, givenUnit, "overhead");
timeRemaining[stackCounter] = duration;
stackCounter++;
} else {
BJDebugMsg("Stunned units stack overflow!");
}
}
// Remove unit from stack
private void StackPop(int id) {
DestroyEffect(effectsStack[id]);
stackCounter--;
unitsStack [id] = unitsStack [stackCounter];
effectsStack [id] = effectsStack [stackCounter];
timeRemaining[id] = timeRemaining[stackCounter];
unitsStack [stackCounter] = null;
effectsStack [stackCounter] = null;
timeRemaining[stackCounter] = 0.0;
}
void StunUnit(unit givenUnit, float duration) {
int stackedUnitId = StackSearch(givenUnit);
if (stackedUnitId == -1) {
StackPush(givenUnit, duration);
} elseif (timeRemaining[stackedUnitId] < duration) {
timeRemaining[stackedUnitId] = duration;
}
}
private void TimerCallback() {
int i = -1;
while(i++ < stackCounter) {
timeRemaining[i] -= TICK_PERIOD;
IssueImmediateOrderById(unitsStack[i], ORDERID_STOP);
if (timeRemaining[i] <= 0.0) {
StackPop(i);
}
}
}
private void Init() {
TimerStart(periodicTimer, TICK_PERIOD, true, function TimerCallback);
}
}
ledoed, за такое форматирование просто руки отрывать надо и пожизненно лишать доступа к любым IDE.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ledoed
Отредактирован ledoed
а если у тя очень много функций в них ещё много циклов и тд то лутше несколько таймеров по идеи на карту с 800 тригерными спелами уйдут 4 таймера
Отредактирован Clamp
Отредактирован Clamp
Отредактирован ledoed
Masiv[Peremenayz]=peremenaya и для ооп
Кроме того, такое написание явным образом демонстрирует логику работы алгоритма, что в качестве ответа несколько актуальнее. Всё-таки почитай про отступы и стандарты оформления кода и комментариев в нём