При желании с малыми времезатратами его можно перевести на хеш-таблицы.
Есть одна проблема, которую мне решать лень и я просто не знаю, как её решить в самой системе: при создании нового юнита сработает каждый триггер с событием на урон.
TriggerAddCondition()
А у меня эта проблема не возникает.
Выход за пределы зоны карты у тебя приведёт к повторному добавлению события.
Что за ужасная смесь жасса и сжасса? И где инклюды?
Ты это о чём? какая ещё смесь? В чём это выражено? Если ты о типе real вместо си-шного float или double, то просто real проще звучит и его быстрее писать. А инклуды не использую за ненадобностью.
И как я ранее говорил, можно было и без массива групп.
Нельзя. Т.к. проверки на наличие события нет, а нам эту проверку осуществлять надо: собыите может быть прикреплено и в середине игры, тогда разные триггеры будут иметь разные события. Для избежания сего мы создаём массив групп потриггерно. Угу? (В идеале правда надо было на уничтожение триггера-владельца уничтожать и эти группы, но я не знаю как.)
globals
trigger array Owners;
int OwnerBounty = 0;
group array RegistredUnits;
endglobals
bool UnitTakesDamage_Filter()
{
unit u = GetFilterUnit();
if (u == null)
{u = GetEnumUnit()}
int i = 0;
loop
{
exitwhen i >= OwnerBounty
if !(IsUnitInGroup(u, RegistredUnits[i]))
{
TriggerRegisterUnitEvent(Owners[i], u, EVENT_UNIT_DAMAGED);
GroupAddUnit(RegistredUnits[i], u);
}
i++;
}
u = null; return false;
}
event TriggerAddEventUnitTakesDamage(trigger Owner)
{
if (OwnerBounty == 0)
{
trigger t = CreateTrigger();
region r = CreateRegion();
RegionAddRect(r, bj_mapInitialCameraBounds);
TriggerRegisterEnterRegion(t, r, function UnitTakesDamage_Filter);
t = null; r = null;
}
RegistredUnits[OwnerBounty] = CreateGroup();
Owners[OwnerBounty] = Owner;
OwnerBounty++;
group g = CreateGroup();
GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, null);
ForGroup(g, function UnitTakesDamage_Filter);
DestroyGroup(g);
g = null; return null;
}
Применение:
call TriggerAddEventUnitTakesDamage(TRIGGER)
//где TRIGGER - имя нашего триггера, к которому аттачиться событие
Автор ф-ии - я.
Огромное спасибо за помощь пользователю MyRtZ за те баталии по поводу кода и самому принципу работы ф-ии. Именно он и предложил принцип действия через событие "юнит входит в область ("вся карта")", я пытался делать всё таймером на 0,01 сек. Получилось быстрее, оптимизация сделана.
Внимание!
Ф-ия создаёт побочный триггер и 3 глобалки.
Народ, нужнаСделана функция, игнорируящая дамаг для юнита. Я её сделал, однако она работает корректно только в двух ситуациях из 3: Теперь работает для всех случаев, но для одного из них - слегка коряво (но исправно).
Урон + ХП < макс. ХП.
Урон + ХП > макс. ХП и юнит не умрёт.
Урон + ХП > макс. ХП и юнит умрёт - не получилось сделать правильно.
Вот ф-ия:
define AbilAddHp = 'AInc'; //Ф-ия, добавляющая 1 000 000 к ХП. При необходимости увеличить, однако при этом может процентно уменьшать его.
globals
group AlreadyIgnoring = null;
endglobals
void IgnoreDamage()
{
if (AlreadyIgnoring == null)
{AlreadyIgnoring = CreateGroup()}
unit u = GetTriggerUnit();
if IsUnitInGroup(u, AlreadyIgnoring)
{return}
GroupAddUnit(AlreadyIgnoring, u);
real Life = GetUnitState(u, UNIT_STATE_LIFE);
real Damage = GetEventDamage();
real MaxLife = GetUnitState(u, UNIT_STATE_MAX_LIFE);
if (Life + Damage > MaxLife)
{
if Life - Damage < 0.405
{
UnitAddAbility(u, AbilAddHp);
TriggerSleepAction(0.001);
UnitRemoveAbility(u, AbilAddHp);
SetUnitState(u, UNIT_STATE_LIFE, Life);
}
else
{
TriggerSleepAction(0.001);
SetUnitState(u, UNIT_STATE_LIFE, Life);
}
}
else
{
Life += Damage;
SetUnitState(u, UNIT_STATE_LIFE, Life);
}
GroupRemoveUnit(AlreadyIgnoring, u);
u = null;
}
Поясню суть проблемы:
В случае 1 (в ф-ии он последний) всё просто: мы добавляем к хп юнита урон, и урон это самое хп снимает. Но если таким образом у юнита хп станет выше максимального, то он получит урон. Откуда вытекают случаи 2 и 3 (2 и 1 соответственно): от этого урона юнит не умрёт или умрёт. С первым случаем всё ясно - ждём мгновение и повышаем хп. Однако на практике выяснено, что повышением хп юнит не оживить (а функцию воскрешения я не нашёл). Тогда надо обнулить урон. Но как это сделать? Опять же, в голове 3 варианта:
Добавить неуязвимость (в моей ф-ии так и сделано, но это ради удобства). При этом сбиваются все многие приказы, направленные на данного юнита. Да ещё и надпись "Неуязвимый" в глазах рябит.
Добавить модифицированную Каменную Кожу (Горного Великана), полностью убирающую урон. Недостаток: иконка (неактивный спеллбук нам в помощь) и игнорирование всего урона, полученного в небольшой промежуток времени.
Добавить атаковавшему модифицированную версию Разгрома (Тинкер), полностью убирающую его урон. Недостатки: иконка, обнуление всего урона, нанесённого в небольшой промежуток времени, и обнуление урона сплеш (АоЕ) атак.
(новое) модифицировать его хп =).
Нужно, чтобы ф-ия действовалаует локально и ничему не мешалает. К примеру, каждая 3-я атака по юниту игнорируется.
P.S.
Делал ф-ию на таймерах вместо слипов, но почему-то не реботает. P.P.S.
Ф-ия ещё не прошла все необходимые тесты.
GadenbIsh, разодбудь перевод от Фаргуса. У них всё по-русски, причём проффесионально. (Единственное что, так это перевод некоторых "терминологий" не сошёлся с локализованным, например executor - палач у Фаргуса и Вершитель у 1с (они вроде делали), а ещё Феникс кричит "Фаргус зе бест, Билл Гейтс маст дай!") GadenbIsh, И кстати, почему Рейнора нельзя было посадить в "Стервяника"?
local integer i = 0
local integer a = 255
local unit u = CreateUnit(GetOwningPlayer(GetSpellAbilityUnit()), x, y, angle)
if not(GetLocalPlayer() == GetOwningPlayer(GetSpellTargetUnit())) then
set a = 0
set i = 'Aloc'
endif
call UnitAddAbility(u,i)
call UnitAddAbility(u,l)
call SetUnitVertexColor(u, 255, 255, 255, a)
call TriigerSleepAction(time)
call RemoveUnit(u)
set u = null
Поясню:
Мне нужно сделать юнита невидимым, невыбераемым и неатакумым для всех игроков, кроме владельца цели заклинания.
А ещё мне нужно, чтоб цель заклинания могла бить врагов-галлюцинаций. (а другие на ето спокойно(!) смотрели)
эта новость есть хорошо, но лучше бы оставили систему вара с небольшой модификацией: на сервак сохраняются самые часто играемые мапы, остальные же хранятся на компах хостов. может, не так уж и быстро, зато деньги, место и нервы мэпмэйкеров экономит.
в процессе или лучше - вроде бы мозершип (а в кампинии доп. условие на него сделано: отсутствие Артаниса)
нет, вру, там в очереди или лучше.
Такой вопрос: а где писать (ручками на клаве) требованаие на вполне понятном игроку русском языке. Вроде бы это должно описываться в условиях дерева, но в статье об этом ни слова
» WarCraft 3 / BlizzCon не будет в этом году
» WarCraft 3 / Библиотека функций
Clamp: Согласен.
Clamp: Всеми руками за.
» WarCraft 3 / Библиотека функций
» WarCraft 3 / Библиотека функций
» WarCraft 3 / Библиотека функций
Огромное спасибо за помощь пользователю MyRtZ за те баталии по поводу кода и самому принципу работы ф-ии. Именно он и предложил принцип действия через событие "юнит входит в область ("вся карта")", я пытался делать всё таймером на 0,01 сек. Получилось быстрее, оптимизация сделана.
Ф-ия создаёт побочный триггер и 3 глобалки.
» WarCraft 3 / Библиотека функций
Народ, нужнаСделана функция, игнорируящая дамаг для юнита.Я её сделал, однако она работает корректно только в двух ситуациях из 3:Теперь работает для всех случаев, но для одного из них - слегка коряво (но исправно).неполучилось сделать правильно.В случае 1 (в ф-ии он последний) всё просто: мы добавляем к хп юнита урон, и урон это самое хп снимает. Но если таким образом у юнита хп станет выше максимального, то он получит урон. Откуда вытекают случаи 2 и 3 (2 и 1 соответственно): от этого урона юнит не умрёт или умрёт. С первым случаем всё ясно - ждём мгновение и повышаем хп. Однако на практике выяснено, что повышением хп юнит не оживить (а функцию воскрешения я не нашёл). Тогда надо обнулить урон. Но как это сделать? Опять же, в голове 3 варианта:
всемногие приказы, направленные на данного юнита. Да ещё и надпись "Неуязвимый" в глазах рябит.Нужно, чтобыф-ия действовалаует локально и ничему не мешалает. К примеру, каждая 3-я атака по юниту игнорируется.Делал ф-ию на таймерах вместо слипов, но почему-то не реботает.
P.P.S.
Ф-ия ещё не прошла все необходимые тесты.
» StarCraft 2 / Starcraft II: Rebel Yell
» StarCraft 2 / Starcraft II: Rebel Yell
GadenbIsh, И кстати, почему Рейнора нельзя было посадить в "Стервяника"?
» WarCraft 3 / Этап II: костное анимирование
Ред. Rewenger
» WarCraft 3 / GetLocalPlayer()
Мне нужно сделать юнита невидимым, невыбераемым и неатакумым для всех игроков, кроме владельца цели заклинания.
А ещё мне нужно, чтоб цель заклинания могла бить врагов-галлюцинаций. (а другие на ето спокойно(!) смотрели)
сори, невыбИраемым
» Way of Others / Кампания Морлоков
вар открывается, даже работает, но мод не пашет.
» Way of Others / Way of Others
вар открывается, даже работает, но мод не пашет.
» WarCraft 3 / В завершение
» WarCraft 3 / Церковь Света
» WarCraft 3 / Женщина - маг Кровавых Эльфов
» StarCraft 2 / Смягчение ограничений пользовательских карт
» WarCraft 3 / Эльдар-Страж
» WarCraft 3 / Охотница на Демонов
» WarCraft 3 / Динамическая смена текстуры
» StarCraft 2 / 1.10 Требования
нет, вру, там в очереди или лучше.
Такой вопрос: а где писать (ручками на клаве) требованаие на вполне понятном игроку русском языке. Вроде бы это должно описываться в условиях дерева, но в статье об этом ни слова
» StarCraft 2 / Желтый сталкер
и есть ли рабочий конвертер (сохраняющий анимацию, желательно) M3 <-> MDX
» SC2 Учебник / 5.13 Редактор рас
» WarCraft 3 / Создание Иконок
» WarCraft 3 / Modern Warfare Vehicles Pack