Как по прошествию 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)
}
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
Поставить таймер на 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)
}
}
Принятый ответ
12
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
SaveUnitHandle(H, GetHandleId(t), 0, u)
Функции, обращающиеся к хеш-таблице, я вижу, а вот где сама хеш-таблица?
Также, создавать таймер на каждого юнита - жесть. Они же грузят неимоверно, 100 таймеров и варик все, вешается. Можно же легко сделать на одном таймере все.
7
Sergarr:
unit u = LoadUnitHandle(H, GetHandleId(t), 0)
SaveUnitHandle(H, GetHandleId(t), 0, u)
Функции, обращающиеся к хеш-таблице, я вижу, а вот где сама хеш-таблица?
Также, создавать таймер на каждого юнита - жесть. Они же грузят неимоверно, 100 таймеров и варик все, вешается. Можно же легко сделать на одном таймере все.
Слушай а это тригерно мо джаз?
1
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
7
Spaier:
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
Как именно сделать на 1 таймере? что ты хотел этим сказать?
12
Spaier:
Это Jass.
Хэш Таблицу объявить в корне карты: hashtable H = InitHashtable();
Как именно сделать на 1 таймере?
Делаешь один таймер, вешаешь на него функцию, которая проходит по главному массиву с числами - количеством времени до срабатывания соответствующего действия, уменьшает их на величину периода главного таймера и, если есть числа меньше нуля (соответствующие истекшим таймерам в твоей схеме) - выполняет соответствующие необходимые действия. Всю информацию, необходимую для таких действий, можно легко поместить в массивы, параллельные главному.
Дополнительным плюсом такой схемы является отсутствие необходимости использовать хеш-таблицу.
20
Spaier:
к каждому действию у тебя привязана переменная, и если таймер на 1 сек - каждую 1 сек он будет уменьшать эти переменнык на 1 сек
когда они станут 0 - делаем действия
Чтобы оставить комментарий, пожалуйста, войдите на сайт.