Как по прошествию 10 минут забрать у героя-юнита способность? Другими словами по прошествию 10 минут эта способность просто пропадает...

Принятый ответ

Поставить таймер на 10 минут и забрать способность. Пример: Заклинание, которое даёт юниту способность на определённое время.
scope SwordCharge initializer Init
{
private int SCharge = 'A000'//Id of used ability
private real SCT = 20.//Time
private int SCB = 'A001' Given ability
private bool Conditions(){
return GetSpellAbilityId() == SCharge
}
private void SCTimer()
{
timer t = GetExpiredTimer()
int id = GetHandleId(t)
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
UnitRemoveAbility(u, SCB)
PauseTimer(t)
DestroyTimer(t)
u = null
t = null
}
private void Actions()
{
timer t = CreateTimer()
unit u = GetSpellAbilityUnit()
SaveUnitHandle(H, GetHandleId(t), 0, u)
UnitAddAbility(u, SCB)
TimerStart(t, SCT, false, function SCTimer)
t = null
u = null
}
void Init(){
trigger SwordChargeTrg = new trigger;
TriggerRegisterAnyUnitEventBJ(SwordChargeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddCondition(SwordChargeTrg, Condition(function Conditions))
TriggerAddAction( SwordChargeTrg, function Actions)
}
}
2
1
8 лет назад
Отредактирован Spaier
2
Поставить таймер на 10 минут и забрать способность. Пример: Заклинание, которое даёт юниту способность на определённое время.
scope SwordCharge initializer Init
{
private int SCharge = 'A000'//Id of used ability
private real SCT = 20.//Time
private int SCB = 'A001' Given ability
private bool Conditions(){
return GetSpellAbilityId() == SCharge
}
private void SCTimer()
{
timer t = GetExpiredTimer()
int id = GetHandleId(t)
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
UnitRemoveAbility(u, SCB)
PauseTimer(t)
DestroyTimer(t)
u = null
t = null
}
private void Actions()
{
timer t = CreateTimer()
unit u = GetSpellAbilityUnit()
SaveUnitHandle(H, GetHandleId(t), 0, u)
UnitAddAbility(u, SCB)
TimerStart(t, SCT, false, function SCTimer)
t = null
u = null
}
void Init(){
trigger SwordChargeTrg = new trigger;
TriggerRegisterAnyUnitEventBJ(SwordChargeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddCondition(SwordChargeTrg, Condition(function Conditions))
TriggerAddAction( SwordChargeTrg, function Actions)
}
}
Принятый ответ
3
12
8 лет назад
3
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
SaveUnitHandle(H, GetHandleId(t), 0, u)
Функции, обращающиеся к хеш-таблице, я вижу, а вот где сама хеш-таблица?
Также, создавать таймер на каждого юнита - жесть. Они же грузят неимоверно, 100 таймеров и варик все, вешается. Можно же легко сделать на одном таймере все.
0
7
8 лет назад
0
Sergarr:
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
SaveUnitHandle(H, GetHandleId(t), 0, u)
Функции, обращающиеся к хеш-таблице, я вижу, а вот где сама хеш-таблица?
Также, создавать таймер на каждого юнита - жесть. Они же грузят неимоверно, 100 таймеров и варик все, вешается. Можно же легко сделать на одном таймере все.
Слушай а это тригерно мо джаз?
0
1
8 лет назад
0
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
0
7
8 лет назад
0
Spaier:
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
Как именно сделать на 1 таймере? что ты хотел этим сказать?
0
1
8 лет назад
0
Это был вопрос к Sergarr.
0
7
8 лет назад
0
Spaier:
Это был вопрос к Sergarr.
Окей)
1
12
8 лет назад
1
Spaier:
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
Делаешь один таймер, вешаешь на него функцию, которая проходит по главному массиву с числами - количеством времени до срабатывания соответствующего действия, уменьшает их на величину периода главного таймера и, если есть числа меньше нуля (соответствующие истекшим таймерам в твоей схеме) - выполняет соответствующие необходимые действия. Всю информацию, необходимую для таких действий, можно легко поместить в массивы, параллельные главному.
Дополнительным плюсом такой схемы является отсутствие необходимости использовать хеш-таблицу.
0
1
8 лет назад
0
Sergarr, Можно пример? Не до конца понимаю схему.
0
20
8 лет назад
0
Spaier:
к каждому действию у тебя привязана переменная, и если таймер на 1 сек - каждую 1 сек он будет уменьшать эти переменнык на 1 сек
когда они станут 0 - делаем действия
Чтобы оставить комментарий, пожалуйста, войдите на сайт.