Добавлен nazarpunk,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Zinc
Тип:
Способность
Версия Warcraft:
1.26+
Божественный щит
MUI: да
Импорт: нет
Требования: JNGP
Идея : Bergi_Bear
Описание: Пассивно активируется божественный щит всякий раз, когда здоровье героя падает ниже отметки в 10%. Перезарядка: 20, длительность: 5.
Импорт: нет
Требования: JNGP
Идея : Bergi_Bear
Описание: Пассивно активируется божественный щит всякий раз, когда здоровье героя падает ниже отметки в 10%. Перезарядка: 20, длительность: 5.
Скринншот
Технические подробности
Перенос в свою карту
Способности
- 'Asds' Божественный щит (заклинание)
Предметы
- 'Idsp' Божественный щит
- 'Idsa' Божественный щит
Триггеры
- ItemDivineShield
Настройки
constant integer ITEM_ACTIVE = 'Idsa'; // Активный предмет
constant integer ITEM_PASSIVE = 'Idsp'; // Пассивный предмет
constant real ITEM_ABILITY_COOLDOWN = 20; // Перезарядка способности предмета
trigger DAMAGE_DETECT_TRIGGER = CreateTrigger(); // Не трогать
region MAP_REGION; // Не трогать
hashtable HT = InitHashtable(); // Хэштаблица, можете вписать туда вашу, например:
// hashtable HT = udg_HashTable;
Код заклинания
// !nocjass
//! zinc
library ItemDivineShield {
constant integer ITEM_ACTIVE = 'Idsa'; // Активный предмет
constant integer ITEM_PASSIVE = 'Idsp'; // Пассивный предмет
constant real ITEM_ABILITY_COOLDOWN = 20; // Перезарядка способности предмета
trigger DAMAGE_DETECT_TRIGGER = CreateTrigger(); // Не трогать
region MAP_REGION; // Не трогать
hashtable HT = InitHashtable(); // Хэштаблица, можете вписать туда вашу, например:
// hashtable HT = udg_HashTable;
/*
*
*
*
*
*
*/
function isUnitAlive(unit target) -> boolean {
return GetWidgetLife(target) > 0.405;
}
function itemReplaceInstantly(unit u, integer from, integer to){
integer i, slot[], slotI = -1;
item it;
for(0 <= i < bj_MAX_INVENTORY){
it = UnitItemInSlot(u, i);
if (GetItemTypeId(it) == from){
RemoveItem(it);
slotI = slotI + 1;
slot[slotI] = i;
}
}
for(0 <= i <= slotI){
UnitAddItemToSlotById(u, to, slot[i]);
}
it = null;
}
function itemReplaceDelayed(unit u, integer from, integer to){
timer t = CreateTimer();
integer pk = GetHandleId(t);
SaveUnitHandle(HT, pk, 0, u);
SaveInteger(HT, pk, 0, from);
SaveInteger(HT, pk, 1, to);
TimerStart(t, 0.03125, true, function(){
timer t = GetExpiredTimer();
integer pk = GetHandleId(t);
unit u = LoadUnitHandle(HT, pk, 0);
if (isUnitAlive(u)){
itemReplaceInstantly(u, LoadInteger(HT, pk, 0), LoadInteger(HT, pk, 1));
FlushChildHashtable(HT, pk);
PauseTimer(t); DestroyTimer(t);
}
u = null;
t = null;
});
t = null;
}
function itemReplace(unit u, integer from, integer to){
if (isUnitAlive(u)){
itemReplaceInstantly(u, from, to);
} else {
itemReplaceDelayed(u, from, to);
}
}
function itemCount(unit u, integer c) -> integer {
integer i, count = 0;
item it;
for(0 <= i < bj_MAX_INVENTORY){
it = UnitItemInSlot(u, i);
if(GetItemTypeId(it) == c){
count = count + 1;
}
}
it = null;
return count;
}
function addUnitToDetect() -> boolean {
unit u = GetFilterUnit();
if (IsUnitType(u, UNIT_TYPE_HERO)){
TriggerRegisterUnitEvent(DAMAGE_DETECT_TRIGGER, u, EVENT_UNIT_DAMAGED);
}
u = null;
return false;
}
function onInit(){
trigger t[];
integer i;
group g = CreateGroup();
for(0 <= i <= 2){ t[i] = CreateTrigger(); }
MAP_REGION = CreateRegion();
RegionAddRect(MAP_REGION, bj_mapInitialPlayableArea);
t[0] = CreateTrigger();
TriggerRegisterEnterRegion(t[0], MAP_REGION, null);
TriggerAddCondition(t[0], function addUnitToDetect);
GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function addUnitToDetect);
GroupClear(g); DestroyGroup(g); g = null;
TriggerAddCondition(DAMAGE_DETECT_TRIGGER, Condition(function() -> boolean {
unit u = GetTriggerUnit();
item it;
integer i, pk;
real dmg = GetEventDamage();
timer t;
if (
dmg > 0
&&
GetUnitCurrentOrder(u) != 851973
&&
itemCount(u, ITEM_PASSIVE) > 0
&&
GetWidgetLife(u) - dmg <= GetUnitState(u, UNIT_STATE_MAX_LIFE) * 0.1
){
itemReplace(u, ITEM_PASSIVE, ITEM_ACTIVE);
for(0 <= i < bj_MAX_INVENTORY){
it = UnitItemInSlot(u, i);
if(GetItemTypeId(it) == ITEM_ACTIVE){
UnitUseItem(u, it);
break;
}
}
t = CreateTimer();
pk = GetHandleId(t);
SaveUnitHandle(HT, pk, 0, u);
TimerStart(t, ITEM_ABILITY_COOLDOWN - 0.01, false, function(){
timer t = GetExpiredTimer();
integer pk = GetHandleId(t);
unit u = LoadUnitHandle(HT, pk, 0);
itemReplace(u, ITEM_ACTIVE, ITEM_PASSIVE);
u = null;
FlushChildHashtable(HT, pk);
PauseTimer(t); DestroyTimer(t); t = null;
});
}
u = null;
it = null;
t = null;
return false;
}));
for(0 <= i < bj_MAX_PLAYER_SLOTS){
TriggerRegisterPlayerUnitEvent(t[1], Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, null);
TriggerRegisterPlayerUnitEvent(t[2], Player(i), EVENT_PLAYER_UNIT_DEATH, null);
}
TriggerAddCondition(t[1], Condition(function() -> boolean {
unit u = GetTriggerUnit();
item it = GetManipulatedItem();
if (GetItemTypeId(it) == ITEM_PASSIVE && itemCount(u, ITEM_ACTIVE) > 0){
itemReplace(u, ITEM_PASSIVE, ITEM_ACTIVE);
}
u = null;
it = null;
return false;
}));
TriggerAddCondition(t[2], Condition(function() -> boolean {
unit u = GetTriggerUnit();
if (itemCount(u, ITEM_ACTIVE) > 0){
itemReplace(u, ITEM_ACTIVE, ITEM_PASSIVE);
}
u = null;
return false;
}));
for(0 <= i <= 2){t[i] = null;}
}
}
//! endzinc
// !endnocjass
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Extremator
...и без потери юнитом очереди приказов...
Поэтому и спрашивается - чем оно здесь лучше?
. . .
Сейчас бы ещё комменты минусовать... да?
Но тут нет разницы на чём именно делать
не только защитный амулет, подменять его, даммиком кидать спелл который собьёт амулет и запустит кд
Отредактирован nazarpunk